アプリケーションのパフォーマンスを向上させるために、開発段階でループの最適化手法を検討する必要があります。
単純な を反復処理するいくつかの異なる方法を紹介したいと思いますstd::vector<uint32_t> v
。
索引付きの最適化されていないループ:
uint64_t sum = 0; for (unsigned int i = 0; i < v.size(); i++) sum += v[i];
イテレータを含む最適化されていないループ:
uint64_t sum = 0; std::vector<uint32_t>::const_iterator it; for (it = v.begin(); it != v.end(); it++) sum += *it;
キャッシュされた
std::vector::end
反復子:uint64_t sum = 0; std::vector<uint32_t>::const_iterator it, end(v.end()); for (it = v.begin(); it != end; it++) sum += *it;
プリインクリメント イテレータ:
uint64_t sum = 0; std::vector<uint32_t>::const_iterator it, end(v.end()); for (it = v.begin(); it != end; ++it) sum += *it;
範囲ベースのループ:
uint64_t sum = 0; for (auto const &x : v) sum += x;
C++ でループを構築する方法は他にもあります。たとえば、、などを使用しstd::for_each
てBOOST_FOREACH
...
あなたの意見では、パフォーマンスを向上させるための最良のアプローチはどれですか?またその理由は何ですか?
さらに、パフォーマンスが重要なアプリケーションでは、ループをアンロールすると便利な場合があります。繰り返しになりますが、どのアプローチをお勧めしますか?