可能な重複:例えば
for-loop optimization - needed or not?
for loop optimization
は、各反復で再評価された終了条件ですか?
int maxloop = complicated();
for (int i=0;i<maxloop;i++){}
または
for (int i=0;i<complicated();i++){}
それを最適化するために十分賢いコンパイラですか?
約while
?
可能な重複:例えば
for-loop optimization - needed or not?
for loop optimization
は、各反復で再評価された終了条件ですか?
int maxloop = complicated();
for (int i=0;i<maxloop;i++){}
または
for (int i=0;i<complicated();i++){}
それを最適化するために十分賢いコンパイラですか?
約while
?
いいえ、complicated()
が何度も実行された場合、何もしないことを保証できないため、コンパイラは最適化するほどスマートではありません。
いいえ、そうではありません。complicated
は、他の複雑なメソッドに依存するメソッドである可能性があります。
実際には、再計算のオーバーヘッドを避けるために出力を変数に割り当てる必要があります。メソッドの戻り値を制限値にすることを目的とする可能性があるため(つまり、反復ごとに制限を再計算する必要があるかもしれない)、コンパイラはこれを行いません。これをテストするにはcompilcated()
メソッドにThread.Sleep(5000);
と入力すると、待機時間が表示されます。
または単に複雑な()のブレークポイントは、 'メソッドとそれが起こるのを参照してください –
ああ、単純に' Debugger.Break(); ' –
または単純なコンソールアプリケーションのテストに' Console.WriteLine( "このメソッドを書きました"); ' –
コンパイラは "複雑な()"が毎回同じ整数を返さない状況があるため、最適化できません。したがって、毎回条件が実行されます。コードの最初のスニペットはより効率的でなければなりません。
@ CodeNakedこれはJavaであるため、C#は同じ方法で動作するという保証はありません –
期待通りに最適化してはいけません!ですから、コンパイラは十分にスマートです...それをそのままにしておく必要があることを知ってください。 –
@Oskar - あなたが正しいです。それはおそらくこの1つです。http://stackoverflow.com/questions/4477296/for-loop-optimization-needed-or-not-node – CodeNaked