Leistungsunterschied zwischen Iteration durch std::array und std::vector
Mein vorheriger Benchmark, der darauf abzielte, die iterative Leistung von zu bewerten std::array und std::vector enthielten mehrere Mängel. Als ich das Problem noch einmal betrachtete, stellte ich jedoch fest, dass std::vector tatsächlich schneller ist als std::array.
Um jegliches Optimierungspotenzial auszuschließen, habe ich mehrere Maßnahmen ergriffen, darunter:
Die resultierenden Ausführungszeiten für beide Datenstrukturen sind wie folgt:
std::array:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 99.554109
std::vector:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 30.734491
Grund für die Diskrepanz:
Die Leistungsdiskrepanz ist darauf zurückzuführen, dass die Speicherseiten des std::array nicht in der Prozessadresse resident sind Raum. Insbesondere befindet sich ein std::array mit globalem Gültigkeitsbereich im .bss-Abschnitt der ausführbaren Datei, der nicht ausgelagert wurde und auf Null initialisiert ist. Andererseits wurde der std::vector zugewiesen und auf Null initialisiert, was dazu führt, dass seine Speicherseiten bereits im Adressraum vorhanden sind.
Lösung des Problems:
Um dieses Problem zu beseitigen und die Parität zwischen den beiden Datenstrukturen zu demonstrieren, kann man den folgenden Code als erste Zeile von main hinzufügen, um die Seiten einzubinden:
<code class="cpp">std::fill_n(v.data(), n, 1); // included in <algorithm></code>
Alternativ auf Linux-Systemen eine kann mlock(v.data(), v.size() * sizeof(v[0])) verwenden; um die Seiten in den Adressraum zu zwingen. Weitere Einzelheiten finden Sie auf der Handbuchseite von man mlock.
Das obige ist der detaillierte Inhalt vonWarum ist std::vector in der Iteration schneller als std::array?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!