次のようなループが表示されたとします。
for(int i=0;
i<thing.getParent().getObjectModel().getElements(SOME_TYPE).count();
++i)
{
thing.getData().insert(
thing.GetData().Count(),
thing.getParent().getObjectModel().getElements(SOME_TYPE)[i].getName()
);
}
これが Java の場合は、おそらくよく考えないと思います。しかし、C ++のパフォーマンスが重要なセクションでは、それをいじくり回したくなります...しかし、コンパイラがそれを無駄にするほど賢いかどうかはわかりません。これは架空の例ですが、コンテナに文字列を挿入しているだけです。これらのいずれもが STL 型であると想定しないでください。以下について一般的な用語で考えてください。
- for ループ内の乱雑な条件は、毎回評価されるのでしょうか、それとも 1 回だけでしょうか?
- これらの get メソッドが単にオブジェクトのメンバー変数への参照を返す場合、それらはインライン化されますか?
- カスタム [] 演算子がまったく最適化されると思いますか?
言い換えれば、次のようなものに変換するのに時間をかける価値があります (パフォーマンスのみで、読みやすさではありません)。
ElementContainer &source =
thing.getParent().getObjectModel().getElements(SOME_TYPE);
int num = source.count();
Store &destination = thing.getData();
for(int i=0;i<num;++i)
{
destination.insert(thing.GetData().Count(), source[i].getName());
}
これは 1 秒間に何百万回も呼び出されるタイトなループです。私が疑問に思っているのは、これらすべてがループごとに数サイクル削減されるのか、それとももっと実質的なものになるのかということです。
はい、「時期尚早の最適化」についての引用を知っています。そして、プロファイリングが重要であることを知っています。しかし、これは最新のコンパイラ、特に Visual Studio に関するより一般的な質問です。