Std::ranges::minmax_element медленнее, чем std::ranges::min_element и std::ranges::max_elementC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::ranges::minmax_element медленнее, чем std::ranges::min_element и std::ranges::max_element

Сообщение Anonymous »

Я протестировал оба решения для поиска наименьшего и наибольшего значений в пределах диапазона.
Я ожидал, что std::ranges::minmax_element будет быстрее, чем использование std::ranges::min_element, а затем std::ranges::max_element, поскольку следует выполнить один обход вместо двух (как обсуждалось там: Зачем нужно std::minmax_element?).
Но, к моему удивлению, если я не ошибся, std::ranges::minmax_element кажется медленнее (по крайней мере, на https://quick-bench.com/).
Чем можно объяснить такое поведение? Это «ошибка», которую следует исправить в будущем?
Вот мой стенд: https://quick-bench.com/q/ohUNvsA5Egwl0oxgUFzChlD-2C8
И мои фрагменты:

Код: Выделить всё

void use_minmax(std::vector const& vec) {
auto const [min, max] = std::ranges::minmax(vec);
benchmark::DoNotOptimize(min);
benchmark::DoNotOptimize(max);
}

Код: Выделить всё

void use_min_and_max(std::vector const& vec) {
auto const min = std::ranges::min(vec);
auto const max = std::ranges::max(vec);
benchmark::DoNotOptimize(min);
benchmark::DoNotOptimize(max);
}
Согласно документации, сложность std::ranges::minmax порядка 1,5 размера диапазона (в худшем случае), при использовании std::ranges::min и std::ranges::min всегда порядка 2 размера диапазона. Это означает, что фактическое количество операций для std::ranges::minmax хуже: cx1.5xN, где c будет на удивление большим.
Примечание: наивная реализация для одного прохода на самом деле быстрее (хотя и не в два раза быстрее): https://quick-bench.com/q/lOJq7Eu913Qx1evPz4ICCiC_OaA

[EDIT] вот более исчерпывающее сравнение, включая наивную реализацию: https://quick-bench.com/q/5_ibei8zFUM1y9RtM3k5EgnNtwU
Что касается всех содержательных комментариев о реализации clang, вот также тест gcc: https://quick-bench.com/q/aAJ_AgZbAMmW5q5z3XEcchEQ69Q
Он не работает лучше, хотя он более совместим с двумя версиями обхода.
Что касается принципа нулевых накладных расходов, этот стенд меня беспокоит.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -stdranges
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»