Различная производительность контейнера при сборке 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