std::vector の反復が std::array の反復よりも速い理由
以前のベンチマークでは、反復が行われると想定されていました。 std::array を介した方が、std::vector を反復するより高速になります。ただし、その後のベンチマークの改訂により、実際には std::vector の方が高速なオプションであることが判明しました。この記事では、この予期せぬ結果の背後にある理由を検証します。
ベンチマークの改善
改善されたベンチマークでは、元の実装の次の欠陥が解決されました。
ベンチマーク結果
結果のベンチマーク タイミングは、以前の仮定に反して次のことを示しました。
分析
観察されたパフォーマンスの違いは次の点に起因します。 std::array と std::vector のメモリ管理の違い。 std::array の場合、グローバル スコープ配列は最初、非ページ メモリに常駐する実行可能ファイルの .bss セクションに格納されます。その結果、 std::array に初めてアクセスすると、メモリ ページがフォールトインされ、パフォーマンスのオーバーヘッドが発生します。
対照的に、std::vector はメモリ ページを割り当て、ゼロフィルします。創造。これにより、ループがベクターを反復処理するときにページがメモリ内にすでに存在していることが保証されます。
この概念を説明するために、std のメモリ ページを取得するコード行が main 関数の先頭に追加されています。 ::array をアドレス空間に追加します:
<code class="cpp">std::fill_n(v.data(), n, 1);</code>
ページを事前にフォールトすることにより、std::array の実行時間が std::vector の実行時間と一致するまで短縮されます。
結論
std::array による反復処理と std::vector による反復処理のパフォーマンスの違いは、メモリ管理メカニズムに起因します。 std::array ページを事前にフォールトするか、mlock をサポートするオペレーティング システムでプログラムを実行すると、std::array のパフォーマンスが std::vector のパフォーマンスと一致するまで向上します。
以上が私のベンチマークでは、std::vector の反復処理が std::array よりも速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。