反復において std::vector が std::array より速いのはなぜですか?

Linda Hamilton
リリース: 2024-11-02 02:51:30
オリジナル
143 人が閲覧しました

Why is std::vector Faster than std::array in Iteration?

std::array と std::vector による反復間のパフォーマンスの違い

以前のベンチマーク。これは、次の反復パフォーマンスを評価することを目的としていました。 std::array と std::vector には、いくつかの不完全な点がありました。しかし、この問題を再検討すると、std::vector は実際には std::array よりも高速であることがわかりました。

最適化の可能性を軽減するために、次のようないくつかの手段を採用しました。

  • コンパイラの最適化を防ぐためにループの結果を利用する
  • 速度を向上させるために -O3 フラグを使用してコンパイルする
  • std::chrono を使用して対象の for ループのみを測定する

両方のデータ構造の実行時間は次のとおりです。

std::array:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 99.554109
ログイン後にコピー

std::vector:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 30.734491
ログイン後にコピー

不一致の理由:

パフォーマンスの不一致は、プロセス アドレスに常駐していない std::array のメモリ ページに起因します。空間。具体的には、グローバル スコープの std::array は実行可能ファイルの .bss セクションにあり、ページインされておらず、ゼロに初期化されています。一方、std::vector は割り当てられ、ゼロに初期化されているため、そのメモリ ページはアドレス空間にすでに存在しています。

問題の解決:

この問題を解決し、2 つのデータ構造間のパリティを実証するには、次のコードを main の最初の行として追加してページを取り込むことができます。

<code class="cpp">std::fill_n(v.data(), n, 1); // included in <algorithm></code>
ログイン後にコピー

あるいは、Linux システムでは、 mlock(v.data(), v.size() * sizeof(v[0])); を使用できます。ページをアドレス空間に強制的に挿入します。詳細については、man mlock マニュアル ページを参照してください。

以上が反復において std::vector が std::array より速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!