Warum würde die Karte viel schneller als unordered_map?

Implementiert habe ich eine Suche Zwischenspeicherung von Ergebnissen, die aus Schlüsseln bestehen von Art Zustand (a-Klasse mit 7 short ints), und Werte des Typs Socre (eine Klasse von 3 verdoppelt.) Mit unordered_map war mindestens 20 mal langsamer als eine Karte. Warum?

Edit: so ein Mist! Meine hash-Funktion wurde

namespace std {
    size_t hash<State>::operator()(State const& s) const {
        size_t retval = hash<short>()(s.s[0]);
        for (int i = 1; i < R; i += 2) {  //1 3 5
            int x = (static_cast<int>(s.s[i + 1]) << 16)
                + (static_cast<int>(s.s[i]));
            hash_combine(retval, x);
        }
    }
}

Ich vergaß zu return retval, also es war alles kollidieren! Ich Wünsche unordered_map hatte hash_function_quality () - Funktion, die Berichte die Durchschnittliche Anzahl von Kollisionen.

  • Was ist Ihr Zugang Muster?
  • Welche Plattform/compiler?
  • intel i5, gcc, 6 hundert tausend Einsätzen und lookups
  • Verwenden Sie eine hash-Funktion mit unordered_map?
  • ja. würde es funktionieren, wenn ich nicht?
  • Für sechs-hundert-tausend-Einsätzen würde ich wahrscheinlich ein std::map noch. Es ist nur etwa 19 Operationen, um den Zugriff auf ein element. Jeder computer führt die 19-Operationen sehr schnell. Auch die prototypische Computer aus den 1950er Jahren.
  • Es war tatsächlich UB zu fallen das Ende eines Wert-Rückkehr-Funktion. Gcc hat eine Warnung für diese, -Wreturn-Typ, die in die Wand.
  • Der compiler nutze ich, gibt ein lautes Warnsignal, wenn eine Funktion nicht wieder etwas am Ende. Nicht deins?
  • Ich verwende cmake und ich denke, es ist verstecken Sie die Warnhinweise.
  • Genial. Sie herausgefunden, wie man cmake als IDE.

InformationsquelleAutor Neil G | 2011-01-31
Schreibe einen Kommentar