Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist die Iteration durch std::vector in meinem Benchmark schneller als durch std::array?

Warum ist die Iteration durch std::vector in meinem Benchmark schneller als durch std::array?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 03:19:02244Durchsuche

Why is iterating through std::vector faster than std::array in my benchmark?

Warum das Iterieren über std::vector schneller ist als das Iterieren über std::array

In einem früheren Benchmark wurde davon ausgegangen, dass das Iterieren durch std::array wäre schneller als die Iteration durch std::vector. Nachfolgende Überarbeitungen des Benchmarks ergaben jedoch, dass std::vector tatsächlich die schnellere Option war. In diesem Artikel werden die Gründe für dieses unerwartete Ergebnis untersucht.

Benchmark-Verbesserungen

Der verbesserte Benchmark behebt die folgenden Mängel in der ursprünglichen Implementierung:

  • Stellen Sie sicher, dass das Ergebnis der Schleife verwendet wird, um Optimierungsauslassungen zu verhindern.
  • Nutzung des Flags -O3 für Geschwindigkeit Verbesserungen.
  • Verwendung von std::chrono, um die Messung nur auf die for-Schleife zu beschränken.

Benchmark-Ergebnisse

Die resultierenden Benchmark-Timings demonstrierte, dass entgegen der früheren Annahme:

  • std::array: Ausführungszeit = 99,554109 Millisekunden
  • std::vector: Ausführungszeit = 30,734491 Millisekunden

Analyse

Der beobachtete Leistungsunterschied ergibt sich aus dem Speicher Verwaltungsunterschiede zwischen std::array und std::vector. Im Fall von std::array wird das globale Bereichsarray zunächst im .bss-Abschnitt der ausführbaren Datei gespeichert, der sich im nicht ausgelagerten Speicher befindet. Wenn daher zum ersten Mal auf das std::array zugegriffen wird, werden die Speicherseiten fehlerhaft, was zu einem Leistungsaufwand führt.

Im Gegensatz dazu weist std::vector seine Speicherseiten zu und füllt sie mit Nullen auf Schaffung. Dadurch wird sichergestellt, dass die Seiten bereits im Speicher vorhanden sind, wenn die Schleife über den Vektor iteriert.

Um dieses Konzept zu veranschaulichen, wurde am Anfang der Hauptfunktion eine Codezeile hinzugefügt, um die Speicherseiten von std ::array in den Adressraum:

<code class="cpp">std::fill_n(v.data(), n, 1);</code>

Durch die Vorabfehlerierung der Seiten wird die Ausführungszeit von std::array reduziert, um der von zu entsprechen std::vector.

Fazit

Der Leistungsunterschied zwischen der Iteration durch std::array und std::vector ergibt sich aus den Speicherverwaltungsmechanismen. Das Vorab-Fehlern der std::array-Seiten oder das Ausführen des Programms auf einem Betriebssystem, das mlock unterstützt, kann die Leistung von std::array verbessern, um sie an die von std::vector anzupassen.

Das obige ist der detaillierte Inhalt vonWarum ist die Iteration durch std::vector in meinem Benchmark schneller als durch 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