Различная производительность контейнера при сборке Qt MacOS, как это может произойти?

У меня есть QVector на основе контейнера. В некоторых случаях я уже могу сказать, что вектор отсортирован, и в этом случае я пропускаю поиск min/max, но использовать front/back непосредственно.

Теперь я запускаю тест, приведенный ниже: На всех платформах (Win32/Win64/Linux, Qt 5.9) соотношение составляет 0,6–0,75 (значит, по крайней мере, на 25% быстрее с подсказкой), но на MacOS это соотношение составляет 1,1–1,25 (медленнее с намек).

Интересно, как это может случиться? ИМХО это будет означать возвращение front()/last() медленнее, чем при использовании std:min/max,

  • container() возвращает ссылку на QVector
  • back() это просто обертка для last

Функция, использующая подсказку и не использующая min / max, если я знаю порядок. Код для последнего / самого старого аналогичен, в зависимости от обстоятельств используется только передний / задний.

template <class OBJ, class CONTAINER>
OBJ ITimestampWithOffsetObjectList<OBJ, CONTAINER>::latestAdjustedObject() const
{
  if (this->container().isEmpty()) { return OBJ(); }
  if (m_tsAdjustedSortHint == AdjustedTimestampLatestFirst)
    { return this->container().front(); }
  const auto latest = std::max_element(this->container().begin(), this->container().end(), [](const OBJ & a, const OBJ & b) { return a.getAdjustedMSecsSinceEpoch() < b.getAdjustedMSecsSinceEpoch(); });
  return *latest;
};

Тест, который я запускаю:

QTime time;
time.start();
for (int i = 0; i < Max; ++i)
{
  CAircraftSituation s1 = situations.oldestAdjustedObject();
  CAircraftSituation s2 = situations.latestAdjustedObject();
  QVERIFY(s1.getAdjustedMSecsSinceEpoch() < s2.getAdjustedMSecsSinceEpoch());
}
const int noHint = time.elapsed();
situations.setAdjustedSortHint(CAircraftSituationList::AdjustedTimestampLatestFirst);

time.start();
for (int i = 0; i < Max; ++i)
{
  CAircraftSituation s1 = situations.oldestAdjustedObject();
  CAircraftSituation s2 = situations.latestAdjustedObject();
  QVERIFY(s1.getAdjustedMSecsSinceEpoch() < s2.getAdjustedMSecsSinceEpoch());
}

const int hint = time.elapsed();
const double ratio = static_cast<double>(hint) / static_cast<double>(noHint); // expected <1.0

0 ответов

Другие вопросы по тегам