Ist eine unordered_map wirklich schneller als eine Karte in der Praxis?

Sicher, dass die lookup-Leistung einer unordered_map ist konstant über dem Durchschnitt, und die lookup-Leistung der Karte ist O(logN).

Aber natürlich nur, um um ein Objekt zu finden in einer unordered_map, müssen wir:

  1. hash den Schlüssel, den wir finden wollen.
  2. equality_compare der Schlüssel mit jedem Schlüssel im gleichen bucket.

In der Erwägung, dass in einer Karte, müssen wir einfach less_than vergleichen Sie die gesuchten Schlüssel (mit log2(N) Schlüssel, wobei N die Anzahl der Elemente in der Karte.

Fragte ich mich, was die wirklichen performance-Unterschied wäre, gegeben, dass die hash-Funktion fügt overhead und eine equality_compare ist nicht billiger als ein less_than vergleichen.

Eher als die Mühe, die community mit einer Frage, die ich beantworten könnte, mich selbst, ich schrieb einen test.

Ich haben gemeinsam die Ergebnisse unten in den Fall, jemand anders findet dies interessant oder nützlich sind.

Weitere Antworten sind natürlich eingeladen, wenn jemand in der Lage und bereit, weitere Informationen hinzuzufügen.

  • Das problem mit map ist nicht die log N per se; es ist, dass jeder memory access), wie Sie gehen, der Baum ist im wesentlichen zufällig. Dies ist nicht wichtig, wenn die Karte ist klein, aber es dominiert, wenn die Karte groß ist. (Der Unterschied zwischen dem Zugriff auf cache-und Speicher ist um eine Größenordnung oder zwei; siehe z.B. stackoverflow.com/q/4087280. Und dieser Unterschied tendenziell über CPU-Generationen, da die relevanten Physik-lokal ist.) Das gleich-zu - /kleiner-als-Operationen sind nicht wahrnehmbar sind, im Vergleich zu den Mauszeiger jagen.
  • Haben Sie einen Blick auf meine Testergebnisse, insbesondere die flat_map vs map. Es scheint auf den ersten Blick, dass der Zeiger jagt, die Buchhaltung für eine Verdoppelung in lookup-Zeit in eine Karte, wenn im Vergleich zu einem (großen!) sortierten Vektor. Es kann jedoch andere Faktoren spielen hierbei eine Rolle. das Geräusch scheint mehr bereit zu inline ganze Suche für lower_bound auf einen Vektor, als at für eine Karte, zum Beispiel.
Schreibe einen Kommentar