ホームページ  >  記事  >  バックエンド開発  >  `std::vector` の反復処理が `std::array` より速いのはなぜですか?

`std::vector` の反復処理が `std::array` より速いのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 17:18:31754ブラウズ

Why is iterating through `std::vector` faster than `std::array`?

運命の逆転: std::vector の反復処理が std::array を上回るパフォーマンス

当初の想定に反して、最近のベンチマークで明らかになりましたstd::vector の反復処理は、std::array の反復処理よりも大幅に高速であることがわかります。これは、配列が優れた反復パフォーマンスを提供するという以前の考えと矛盾します。

精度を確保するために、ベンチマークではいくつかの改善が採用されました。

  • 結果の消費の強制:コンパイラの最適化によってループが排除されるのを防ぐために、単純なループが使用されました。
  • -O3 最適化の採用: コードは、パフォーマンスを最大化するために最高の最適化レベルでコンパイルされました。
  • ループ測定の分離: std::chrono は、変数の初期化を除き、反復時間のみの測定に使用されました。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。