運命の逆転: std::vector の反復処理が std::array を上回るパフォーマンス
当初の想定に反して、最近のベンチマークで明らかになりましたstd::vector の反復処理は、std::array の反復処理よりも大幅に高速であることがわかります。これは、配列が優れた反復パフォーマンスを提供するという以前の考えと矛盾します。
精度を確保するために、ベンチマークではいくつかの改善が採用されました。
std::array と std::vector の測定時間は次のとおりです。
std::array: 99.554109 milliseconds std::vector: 30.734491 milliseconds
原因の調査
std::vector の驚くべき速度の利点は、メモリ ページングに起因すると考えられます。グローバル スコープに格納される配列は、最初は実行可能ファイルの .bss セクションに存在し、プロセス アドレス空間にページングされません。対照的に、std::vector は作成中に割り当てられ、ゼロが埋め込まれるため、そのメモリ ページがメモリ内に存在します。
問題への対処
競争の場を平準化するには、反復の前に配列を明示的に初期化するか、そのページをメモリに取り込むことができます。ここでは、配列の反復時間を std::vector の反復時間と同等にする変更を示します。
<code class="cpp">std::fill_n(v.data(), n, 1);</code>
あるいは、mlock() 関数を使用して、配列ページを Linux システム上のメモリに強制的に挿入することもできます。
この調整は、std::array と std::vector のパフォーマンスの違いが主にメモリ管理戦略に起因することを示しており、プログラムのパフォーマンスにおけるメモリ アクセス パターンの重要性が強調されています。
以上が`std::vector` の反復処理が `std::array` より速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。