std::vector はネイティブ配列よりも大幅に遅いですか?
std::vector は基本的に次のように実装されているという話を聞いたことがあるかもしれません。これは、パフォーマンスが同等であることを意味します。ただし、最近のテストではそうではなく、std::vector がパフォーマンスに重大なペナルティを示していることが示唆されています。この記事の目的は、std::vector が実際にネイティブ配列よりもはるかに遅いかどうかを明らかにすることです。
パフォーマンス分析
提供されたテスト コードは、大規模な配列の初期化にかかる時間を測定します。 3 つの異なるメソッドを使用した Pixel オブジェクトの配列:resize() を使用した std::vector、push_back() を使用した std::vector、およびプレーン配列malloc()で割り当てられます。結果は、resize() を使用した std::vector は単純な配列よりも約 4 倍遅く、push_back() を使用した std::vector はさらに遅いことを示しています。
しかし、詳しく調べると、それが明らかになります。パフォーマンスの違いは、テスト コードがベクトルを 2 回繰り返すという事実から生じていることがわかります。最初の反復ではオブジェクトが初期化され、2 番目の反復では単純にオブジェクトが読み取られます。これは、一度だけ初期化できるプレーン配列との公平な比較を容易にするために行われます。
改訂テスト
std::vector のパフォーマンスを正確に比較するためネイティブ配列に対して、ベクトルを 1 回だけ初期化するようにテスト コードが変更されました:
std::vector<Pixel> pixels(dimensions * dimensions, Pixel(255, 0, 0));
この変更により、パフォーマンス ギャップが生じますstd::vector と単純な配列の間のパフォーマンスは無視できるようになりました:
g++ -O3 Time.cpp -I <MyBoost> ./a.out UseVector completed in 2.216 seconds
結論
改訂されたテスト結果に基づくと、std::vector のパフォーマンスは同等ですネイティブ配列のものに。最初のテストで観察された明らかな遅さは、std::vector に使用された非効率的な初期化メソッドが原因でした。適切に初期化されると、std::vector はネイティブ配列と比較して最小限のパフォーマンス オーバーヘッドを示します。
提示されたテスト結果は、Pixel クラスおよび採用された特定の初期化パターンに固有であることに注意してください。他のクラスや初期化シナリオではパフォーマンスが異なる場合があります。
以上が`std::vector` は本当にネイティブ配列より遅いのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。