反復パフォーマンスの複雑さ: 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 サイトの他の関連記事を参照してください。