Я ожидал, что 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);
}
Примечание: наивная реализация для одного прохода на самом деле быстрее (хотя и не в два раза быстрее): 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
Мобильная версия