Calling std :: nth_element () funktioniert sehr häufig

Ich habe dieses spezielle Thema nirgends gefunden ...

Ich rufe den Algorithmus nth_element () ungefähr 400.000 Mal pro Sekunde für verschiedene Daten in einem std :: -Vektor mit 23 ganzen Zahlen auf, genauer gesagt mit "vorzeichenlosen kurzen" Werten.

Ich möchte die Rechengeschwindigkeit verbessern, und dieser spezielle Aufruf benötigt einen erheblichen Teil der CPU-Zeit. Jetzt habe ich wie bei std :: sort () festgestellt, dass die Funktion nth_element auch bei höchster Optimierungsstufe und NDEBUG-Modus (Linux-Clang-Compiler) im Profiler sichtbar ist, sodass der Vergleich inline ist, aber nicht der Funktionsaufruf selbst. Naja, mehr preise: nicht nth_element () sondern std :: __ introselect () ist sichtbar.

Da die Datenmenge klein ist, habe ich mit einer quadratischen Sortierfunktion PIKSORT experimentiert, die häufig schneller ist als der Aufruf von std :: sort, wenn die Datenmenge weniger als 20 Elemente beträgt, wahrscheinlich, weil die Funktion inline ist.

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;
    }
}

In diesem Fall war dies jedoch langsamer als die Verwendung von nth_element.

Auch eine statistische Methode ist nicht angebracht,Etwas schneller als std :: nth_element

Finally, da die Werte im Bereich von 0 bis ungefähr 20000 liegen, sieht eine Histogrammmethode nicht angemessen aus.

Meine Frage: kennt jemand eine einfache Lösung dafür? Ich glaube, ich bin wahrscheinlich nicht der einzige, der sehr häufig std :: sort oder nth_element aufrufen muss.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage