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

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

Patricia Arquette
リリース: 2024-11-02 03:19:02
オリジナル
271 人が閲覧しました

Why is iterating through std::vector faster than std::array in my benchmark?

std::vector の反復が std::array の反復よりも速い理由

以前のベンチマークでは、反復が行われると想定されていました。 std::array を介した方が、std::vector を反復するより高速になります。ただし、その後のベンチマークの改訂により、実際には std::vector の方が高速なオプションであることが判明しました。この記事では、この予期せぬ結果の背後にある理由を検証します。

ベンチマークの改善

改善されたベンチマークでは、元の実装の次の欠陥が解決されました。

  • 最適化漏れを防ぐためにループの結果が使用されるようにします。
  • 速度向上のために -O3 フラグを利用します。
  • 測定を for ループのみに分離するために std::chrono を採用します。

ベンチマーク結果

結果のベンチマーク タイミングは、以前の仮定に反して次のことを示しました。

  • std::array:実行時間 = 99.554109 ミリ秒
  • std::vector: 実行時間 = 30.734491 ミリ秒

分析

観察されたパフォーマンスの違いは次の点に起因します。 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 サイトの他の関連記事を参照してください。

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