Ich denke, die Frage ist teilweise beantwortet, da keine Informationen über die Leistung mit "int"-Typen als Schlüssel bereitgestellt wurden. Ich habe meine eigene Analyse durchgeführt und herausgefunden, dass std::map in vielen praktischen Situationen (in Bezug auf die Geschwindigkeit) std::unordered_map übertreffen kann, wenn Ganzzahlen als Schlüssel verwendet werden.
Integer-Test
Das Testszenario bestand darin, Karten mit sequentiellen und zufälligen Schlüsseln und mit String-Werten mit Längen im Bereich [17:119] in Vielfachen von 17 zu füllen. Die Tests wurden mit einer Elementanzahl im Bereich [10:100000000] in Potenzen von 10 durchgeführt.
Labels:
Map64: std::map<uint64_t,std::string>
Map32: std::map<uint32_t,std::string>
uMap64: std::unordered_map<uint64_t,std::string>
uMap32: std::unordered_map<uint32_t,std::string>
Einfügung
Labels:
Sequencial Key Insert: maps were constructed with keys in the range [0-ElementCount]
Random Key Insert: maps were constructed with random keys in the full range of the type
![random-key-insert]()
Schlussfolgerung zu Einfügung :
- Das Einfügen von verteilten Schlüsseln in std::map ist tendenziell besser als std::unordered_map, wenn die Größe der Karte unter 10000 Elementen liegt.
- Das Einfügen von dichten Schlüsseln in std::map zeigt unter 1000 Elementen keinen Leistungsunterschied zu std::unordered_map.
- In allen anderen Situationen ist std::unordered_map tendenziell schneller.
Nachschlagen
Labels:
Sequential Key - Seq. Search: Search is performed in the dense map (keys are sequential). All searched keys exists in the map.
Random Key - Rand. Search: Search is performed in the sparse map (keys are random). All searched keys exists in the map.
(label names can be miss leading, sorry about that)
![random_key]()
Schlussfolgerung zu nachschlagen :
- Die Suche auf der gespreizten std::map ist tendenziell etwas besser als die std::unordered_map, wenn die Größe der Map unter 1000000 Elementen liegt.
- Suche auf dichter std::map übertrifft std::unordered_map
Fehlgeschlagene Suche
Labels:
Sequential Key - Rand. Search: Search is performed in the dense map. Most keys do not exists in the map.
Random Key - Seq. Search: Search is performed in the sparse map. Most keys do not exists in the map.
(label names can be miss leading, sorry about that)
![random_key_ss]()
Schlussfolgerung zu Fehlgeschlagener Nachschlag :
- Suche vermissen ist eine große Auswirkung in std::map.
Allgemeine Schlussfolgerung
Selbst wenn Geschwindigkeit gefragt ist, kann std::map für Integer-Schlüssel in vielen Situationen die bessere Wahl sein. Ein praktisches Beispiel: Ich habe ein Wörterbuch in dem Nachschlagevorgänge nie fehlschlagen, und obwohl die Schlüssel spärlich verteilt sind, wird es mit der gleichen Geschwindigkeit wie std::unordered_map ausgeführt, da die Anzahl der Elemente unter 1K liegt. Und der Speicherplatzbedarf ist deutlich geringer.
String-Test
Als Referenz finden Sie hier die Zeitangaben für string[string] Karten. Key-Strings werden aus einem zufälligen uint64_t-Wert gebildet, Value-Strings sind die gleichen, die auch in den anderen Tests verwendet werden.
Labels:
MapString: std::map<std::string,std::string>
uMapString: std::unordered_map<std::string,std::string>
![string_string_maps]()
Bewertungsplattform
OS: Linux - OpenSuse Tumbleweed
Compiler: g++ (SUSE Linux) 11.2.1 20210816
CPU: Intel(R) Core(TM) i9-9900 CPU @ 3,10GHz
RAM: 64Gb