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

Warum ist die Iteration durch „std::vector“ in diesem Benchmark schneller als „std::array“?

Linda Hamilton
Linda HamiltonOriginal
2024-11-01 14:50:02739Durchsuche

Why is Iterating through `std::vector` Faster than `std::array` in This Benchmark?

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!

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