13

次のコード ブロック間にはパフォーマンスの違いがあると言われています。

foreach (Entity e in entityList)
{
 ....
}

for (int i=0; i<entityList.Count; i++)
{
   Entity e = (Entity)entityList[i];
   ...
}

どこ

List<Entity> entityList;

私はCLRを期待していませんが、基本的に同じコードに要約する必要があると言えます。誰か具体的な証拠を持っている人はいますか?

4

7 に答える 7

10

foreach は (GetEnumerator から返される) 列挙子のインスタンスを作成し、その列挙子も foreach ループの過程で状態を保持します。次に、列挙子で Next() オブジェクトを繰り返し呼び出し、返される各オブジェクトに対してコードを実行します。

実際には、独自の列挙子を作成した場合に表示される同じコードにはなりません。

于 2008-09-04T17:22:27.043 に答える
9

これは、2 つのループ間の IL の違いを示す優れた記事です。

Foreach は技術的には遅くなりますが、はるかに使いやすく、読みやすくなっています。パフォーマンスが重要でない限り、for ループよりも foreach ループを好みます。

于 2008-09-04T17:24:50.580 に答える
6

foreachサンプルは、おおよそ次のコードに対応しています。

using(IEnumerator<Entity> e = entityList.GetEnumerator()) {
    while(e.MoveNext()) {
        Entity entity = e.Current;
        ...
    }
}

ここでは、通常のforループが支払う必要のない2つのコストがあります。

  1. entityList.GetEnumerator()によって列挙子オブジェクトを割り当てるコスト。
  2. リストの各要素に対する2つの仮想メソッド呼び出し(MoveNextとCurrent)のコスト。
于 2008-09-04T17:32:22.763 に答える
3

ここで見逃している 1 つの点: List には Count プロパティがあり、その中に含まれる要素の数を内部的に追跡します。

IEnumerable はそうではありません。

インターフェイス IEnumerable にプログラムし、カウント拡張メソッドを使用すると、要素をカウントするためだけに列挙されます。

ただし、IEnumerable ではインデックスでアイテムを参照できないため、議論の余地があります。

したがって、リストと配列にロックインしたい場合は、パフォーマンスがわずかに向上します。

柔軟性が必要な場合は、foreach を使用し、IEnumerable にプログラムします。(linq および/または yield return の使用を許可します)。

于 2008-09-04T17:56:26.947 に答える
1

割り当てに関しては、このブログ投稿を参照することをお勧めします。これは、どのような状況で列挙子がヒープに割り当てられているかを正確に示しています。

于 2008-09-04T17:36:10.710 に答える
0

パフォーマンスが向上する可能性のある状況の1つは、列挙可能な型のサイズとループ条件が定数である場合だと思います。例えば:

const int ArraySize = 10;
int[] values = new int[ArraySize];

//...

for (int i = 0; i 

In this case, depending on the complexity of the loop body, the compiler might be able to replace the loop with inline calls. I have no idea if the .NET compiler does this, and it's of limited utility if the size of the enumerable type is dynamic.

One situation where foreach might perform better is with data structures like a linked list where random access means traversing the list; the enumerator used by foreach will probably iterate one item at a time, making each access O(1) and the full loop O(n), but calling the indexer means starting at the head and finding the item at the right index; O(N) each loop for O(n^2).

Personally I don't usually worry about it and use foreach any time I need all items and don't care about the index of the item. If I'm not working with all of the items or I really need to know the index, I use for。それが大きな懸念事項であることがわかったのは、リンクリストのような構造だけです。

于 2008-09-04T17:31:02.453 に答える
0
For Loop
for loop is used to perform the opreration n times
for(int i=0;i<n;i++)
{
l=i;
}
foreach loop

int[] i={1,2,3,4,5,6}
foreach loop is used to perform each operation value/object in IEnumarable 
foreach(var k in i)
{
l=k;
}
于 2014-01-13T06:14:27.873 に答える