Я не нашел эту конкретную тему нигде...
Я вызываю алгоритм nth_element() около 400 000 раз в секунду для разных данных в std::vector из 23 целых чисел, более точных значений без знака.
Я хочу улучшить скорость вычислений, и этот конкретный вызов требует значительной части времени процессора. Теперь я заметил, что, как и в случае std:: sort(), функция nth_element видна в профилировщике даже с самым высоким уровнем оптимизации и режимом NDEBUG (компилятор Linux Clang), поэтому сравнение является встроенным, но не вызовом функции. Ну, больше preise: не nth_element(), но std:: __ introselect() виден.
Поскольку размер данных мал, я экспериментировал с использованием квадратичной функции сортировки PIKSORT, которая часто быстрее, чем вызов std:: sort, когда размер данных составляет менее 20 элементов, вероятно, потому, что функция будет встроенной.
template <class CONTAINER>
inline void piksort(CONTAINER& arr) // indeed this is "insertion sort"
{
typename CONTAINER::value_type a;
const int n = (int)arr.size();
for (int j = 1; j<n; ++j) {
a = arr[j];
int i = j;
while (i > 0 && a < arr[i - 1]) {
arr[i] = arr[i - 1];
i--;
}
arr[i] = a;
}
}
Однако это было медленнее, чем использование nth_element в этом случае.
Кроме того, использование статистического метода не подходит, Что-то быстрее, чем std:: nth_element
Наконец, поскольку значения находятся в диапазоне от 0 до 20000, метод гистограммы не подходит.
Мой вопрос: кто-нибудь знает простое решение? Я думаю, что я, вероятно, не единственный, кто очень часто вызывает std:: sort или nth_element.