Gast
#6890139
Um mal wieder etwas handfeste Info zum Programmieren zu bringen: In den angehängten Bildern findet ihr Benchmarks für verschiedene gängige C/C++ Suchmethoden. Im Prinzip nichts Neues, aber es sind aktuelle gemessene Daten, die euch als Entscheidungsgrundlage für eure Programme dienen können. OS ist Win10, Compiler ist VS2019, System ist ein i7-8850H Laptop (L1 Cache 32kByte, L2=256k, L3=1.5MByte). Gesucht werden 32 Byte Strukturen in einem Feld. Als Suchindex dient ein Integer, damit die Vergleichsfunktion so wenig Einfluss wie möglich hat. Das Feld mit den N Strukturen ist immer aufsteigend sortiert. Die Suchwerte kommen aus einem zweiten Feld mit Integer Werten. Dieses zweite Feld ist entweder mit Zufallszahlen initialisiert, oder linear aufsteigend von 1 - N sortiert. Das erste Bild zeigt die Ergebnisse, wenn das zu suchende Element zufällig ist, das zweite Bild zeigt die Ergebnisse, wenn die zu suchenden Elemente der Reihe nach gesucht werden. Suchmethoden: Direct-Access: Hier wird direkt auf table[map[index]] zugegriffen. Wir liegen hier bei teilweise 250 Pikosekunden :-) Robin-Hood Hash Map: Eine selbstgestrickte Hash-Map, die das Robin-Hood Verfahren verwendet. Als Hash-Funktion kommt CRC32 zum Einsatz. Da gibt es teilweise noch Probleme (bei ca. 20000 Bytes) mit Kollisionen, das muss ich mir noch anschauen. Eine gute Referenz ist https://codecapsule.com/2013/11/11/robin-hood-hashing/ AVL-Tree: Adelson Velskii Landis (AVL) Balanced Binary Tree. Standardmethode seit 1962 aus Russland. Erstaunlich viele und komplizierte Spezialfälle, ich möchte es nicht noch mal ausprogrammieren. Einstieg: https://de.wikipedia.org/wiki/AVL-Baum std::map: Verwendent angeblich einen Red-Black Balanced Binary Tree. Wenn da jemand mehr Info hat, dann her damit. std::unordered_map: C++ Hash Tabelle. Leider ist mir da auch nichts genaueres bekannt. Linear-Search: Ist eine einfach for() Schleife. Laut https://dirtyhandscoding.github.io/posts/performance-comparison-linear-search-vs-binary-search.html soll ja lineare Suche bei weniger als ca. 256 Einträgen schneller sein. Das habe ich mit dem Code von jender Seite auch nachvollziehen können. Bei diesen etwas komplexeren Daten hier aber nicht, da muss ich aber noch mehr testen. Bei Fragen kann man das gerne diskutieren und auch ausbauen! Besten Gruss, Udo






