Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist std::vector in der Iteration schneller als std::array?

Warum ist std::vector in der Iteration schneller als std::array?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 02:51:30144Durchsuche

Why is std::vector Faster than std::array in Iteration?

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:

  • Nutzung des Ergebnisses der Schleife, um Compiler-Optimierungen zu verhindern
  • Kompilieren mit dem Flag -O3 für höhere Geschwindigkeit
  • Messen ausschließlich der angestrebten for-Schleife mit std::chrono

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn