2010-12-18 4 views
16

以下のようにFORループを最適化する必要がありますか、それともコンパイラが私のために行いますか?forループ最適化 - 必要かどうか?

//this is slow, right? 
for (int i = 0; i < menuItem.DropDownItems.Count; i++) 
{ 
    ... 
} 

//this should be much faster right? 
for (int i = 0, count = menuItem.DropDownItems.Count; i < count; i++) 
{ 
    ... 
} 

PS。私はこれがすでに掲載されていると確信していますが、何も見つけられませんでした。

PPS。申し訳ありませんが、私は多くのJavaScriptをコーディングしています。この種の最適化を考える必要があるのは...ネットではばかばかしいかもしれません。

+10

あなたは両方の方法でコードを書いています。どちらが速いのかを知りたければ、それらの両方を実行し、それぞれのタイミングを測定してください。数秒で決定的な回答を得ることができるときにインターネットに推測する必要はありません。 –

答えて

19

まあ、それはDropDownItems.Countが実装されている方法によって異なります - しかし、率直に言って、それはそうは、単純なフィールド担保財産... 2番目と同じくらい速い最初のコードになるだろうことだが、ずっとより読みやすいです。

可読性まず、パフォーマンスを測定し、必要な場合にのみマイクロ最適化を行います。

可能であれば、可読性の理由から、やはりforeachループを開始することをお勧めします。

を実行しても、は一時変数を使用したい場合は、forループ自体を単純なままにして、変数を別の変数にカウントアップします。確かにそれは、より広い範囲を意味するが、それは簡単です:

int count = menuItem.DropDownItems.Count; 
for (int i = 0; i < count; i++) 
{ 
    ... 
} 

くらいはしかし単なる個人的な好みであること。

+0

+1 "可読性の最初の"コメント。 :) しかし、 'foreach'ループはキャストのためにここでは直接動作しませんか?したがって、繰り返しごとに余分なキャストが発生します。 – Mehrdad

+0

@Lambert:現時点ではわかりませんが、ループ内のコードは見られませんでした。しかし、 'foreach'のためにキャストがあれば、通常は' for'を使ってループ本体にキャストされます。 –

+2

このUIを使っても、そのナノ秒のものを削ることは、本当に誰の日にも輝くことはありません。このようなものは、画面を再描画するのにかかる時間と比較して、ピーナッツです。 UIスレッドをブロックしないで反応的なUIに集中すると、ユーザーの顔に笑顔が広がります。 – gjvdkamp

0

...とはなんですか?このような質問のなかで、私の最初の対応は、「この場合でも問題はありますか?」と尋ねることです。パフォーマンスは常に相対的です。その正確なコード行がスタック上にあるか、スタックの最後に10%を超えていれば、それは心配する価値がありますが、それは通常はほとんどありません。

関連する問題