3

私は現在、可能な限り優れたパフォーマンスを発揮する必要のあるアプリケーションを作成しています。IDE(およびコンパイラ)としてVS2012を使用しています。

ベクトルを反復処理しているときに、イテレータとは対照的にポインタソリューションの方が速度の点ではるかに高速であることに気付きました。何故ですか?つまり、イテレータは基本的に同じものです。少なくともそうあるべきです。

この例を見てください:

std::vector<int> v;
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    // Do stuff with *it
}

for (int* i = &v[0], i <= &v[v.size()-1]; i++) {
    // Do stuff with *i
}

コンパイラに必要な最適化はありますか?私はすべての標準設定を使用しているので、-O2はすでに有効になっています。前もって感謝します。

編集: 私はリリースでコンパイルしていて、Ctrl + F5で実行しています(デバッグなしで)。

EDIT2: 実際のソースコードはクイックソートの実装です。ここに完全なソースへのリンクがあります、その非常に短いのでそれをチェックしてください。

4

3 に答える 3

4

私は現在、可能な限り優れたパフォーマンスを発揮する必要のあるアプリケーションを作成しています。

次に、プロファイラーを取得して、実際のボトルネックがどこにあるかを確認します。もちろん、最適化されたコード(リリースモード)では。

-VS2012ではO2がすべてではありません#defines。境界チェックやその他のセキュリティチェックに対して、標準のコンテナイテレータの動作を操作するものがいくつかあります。それらを調べて(「チェックされたイテレータ」と「セキュアSCL」が適切なサイトにつながる可能性があります)、それに応じて設定することをお勧めします。

しかし、コンテナーでの反復がボトルネックになるかどうかは非常に疑わしいです。パフォーマンスの問題により敏感なコードの他のセクションがあります。

于 2013-03-13T08:01:39.220 に答える
2

考えられる理由の1つは、イテレータを事前にインクリメントするのではなく、ポストインクリメントしていることです。代わりにこれを試してください:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)

一部の(おそらくほとんどの)コンパイラがこの問題を最適化するため、これによって速度が向上しない場合があります。ただし、ポストインクリメントする場合は、ループで期待するものを返すことができるように、古いイテレータ値の一時的なコピーを作成する必要がある場合があります。とにかくやってみるものです。

于 2013-03-13T07:59:32.580 に答える
1

パフォーマンスを向上させる簡単な方法の1つは、end反復ごとにメソッドを実行しないことです。また、実行し++itないでit++ください。

すなわち

std::vector<int> v;
const std::vector<int>::iterator end = v.cend();
for (std::vector<int>::iterator it = v.begin(); it != end; ++it) {
    // Do stuff with *it
}
于 2013-03-13T08:07:26.270 に答える