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:
Benchmark-Ergebnisse
Die resultierenden Benchmark-Timings demonstrierte, dass entgegen der früheren Annahme:
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!