Heim >Backend-Entwicklung >C++ >Warum ist die Iteration durch „std::vector' in diesem Benchmark schneller als „std::array'?
Die Verwirrung der Iterationsleistung: std::array vs. std::vector
In einer früheren Untersuchung wurde festgestellt, dass Iteration durch ein std::array war deutlich schneller als das Durchlaufen eines std::vector. Um diese fehlerhaften Beobachtungen zu korrigieren, wurde ein neuer Benchmark entwickelt, der eine verblüffende Umkehrung offenbarte: Die Iteration durch std::vector war jetzt deutlich schneller.
Um mögliche Optimierungen zu vermeiden, wurde das Ergebnis der Schleife einbezogen und die - O3-Flag wurde aktiviert. Darüber hinaus wurde std::chrono für ein präzises Timing verwendet, um die Ausführung der Schleife zu isolieren.
Die Ergebnisse waren beeindruckend:
std::array:
$ ./a.out result: 0 time: 99.554109
std::vector:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 30.734491
Das Geheimnis lüften
Bei der Untersuchung der Demontage in Godbolt wurde es Es ist offensichtlich, dass die Leistungsdiskrepanz auf die Speicherseitenresidenz im Prozessadressraum zurückzuführen ist. Während der std::vector bereits zugewiesen und mit Nullen gefüllt wurde, wurde das std::array im globalen .bss-Abschnitt der ausführbaren Datei gespeichert und seine Seiten wurden nicht ausgelagert.
Auflösung das Problem
Um diese Diskrepanz zu beheben, ist es notwendig, die std::array-Seiten in den Adressraum zu bringen. Dies kann erreicht werden, indem am Anfang der Hauptfunktion die folgende Zeile hinzugefügt wird:
std::fill_n(v.data(), n, 1); // included in <algorithm>
oder alternativ unter Linux mit mlock():
mlock(v.data(), v.size() * sizeof(v[0]));
Fazit
Dieser Benchmark unterstreicht die Bedeutung der Seitenresidenz für die Leistung der Iteration. Indem sichergestellt wird, dass die Seiten sowohl von std::array als auch von std::vector im Adressraum vorhanden sind, kann die Iterationsleistung erheblich verbessert werden.
Das obige ist der detaillierte Inhalt vonWarum ist die Iteration durch „std::vector' in diesem Benchmark schneller als „std::array'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!