ホームページ > バックエンド開発 > C++ > このベンチマークでは、「std::vector」の反復処理が「std::array」よりも速いのはなぜですか?

このベンチマークでは、「std::vector」の反復処理が「std::array」よりも速いのはなぜですか?

Linda Hamilton
リリース: 2024-11-01 14:50:02
オリジナル
828 人が閲覧しました

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

反復パフォーマンスの複雑さ: std::array と std::vector

以前の調査で、反復がstd::array を介した処理は、std::vector を介した反復処理よりも著しく高速でした。これらの欠陥のある観察を修正するために、新しいベンチマークが考案され、驚くべき逆転が明らかになりました。std::vector の反復処理が大幅に高速化されました。

潜在的な最適化を回避するために、ループの結果が組み込まれ、- O3 フラグが有効になりました。さらに、std::chrono はループの実行を分離する正確なタイミングに使用されました。

結果は驚くべきものでした。

std::array:

$ ./a.out
result: 0
time: 99.554109
ログイン後にコピー

std::vector:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 30.734491
ログイン後にコピー

謎を解く

ゴッドボルトで逆アセンブリを調べてみると、パフォーマンスの不一致が、プロセス アドレス空間内のメモリ ページの常駐に起因していることは明らかです。 std::vector はすでに割り当てられ、ゼロが埋め込まれていましたが、std::array は実行可能ファイルのグローバル .bss セクションに格納されており、そのページはページインされていませんでした。

解決問題

この不一致を解決するには、std::array ページをアドレス空間に取り込む必要があります。これは、メイン関数の先頭に次の行を追加することで実現できます:

std::fill_n(v.data(), n, 1); // included in <algorithm>
ログイン後にコピー

または、Linux では mlock() を使用します:

mlock(v.data(), v.size() * sizeof(v[0]));
ログイン後にコピー

結論

このベンチマークは、反復のパフォーマンスにおけるページ常駐の重要性を強調しています。 std::array と std::vector の両方のページがアドレス空間に存在するようにすることで、反復パフォーマンスを大幅に向上させることができます。

以上がこのベンチマークでは、「std::vector」の反復処理が「std::array」よりも速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート