题
我已经告诉有一个业绩之间的差异以下代码块。
foreach (Entity e in entityList)
{
....
}
和
for (int i=0; i<entityList.Count; i++)
{
Entity e = (Entity)entityList[i];
...
}
哪里
List<Entity> entityList;
我没有CLR期望,但是从什么我可以告诉他们应该归结为基本上相同的代码。没有任何人有具体的(见鬼,我带包装污物)的证据的一种方式或其他的?
解决方案
foreach创建的一个实例数(返回GetEnumerator)和这枚举也保持国家的整个过程中foreach循环。然后,它一再呼吁下一次()目的在枚举和运行你的代码对于每个物体返回。
他们不会归结到同样的代码,在任何方式,真的,你会看到如果你写你自己的枚举器。
其他提示
在这里, 是一个很好的文章,表示IL差异,两者之间的循环。
Foreach在技术上较慢但更容易使用和易于阅读。除非业绩是关键,我喜欢foreach循环的循环。
Foreach样品大致对应于这个代号:
using(IEnumerator<Entity> e = entityList.GetEnumerator()) {
while(e.MoveNext()) {
Entity entity = e.Current;
...
}
}
有两种费用在这里,定期为环不必支付:
- 费用分配的数目由entityList.GetEnumerator().
- 成本的两个虚拟方法的呼吁(MoveNext和前)为每个元素的列表。
一点错过了这里:一个列有一个数酒店,在内部跟踪的许多元素都在。
一种类型不会。
如果你计划的界面类型和使用的最扩展的方法,它将一一列举,只是计数的元素。
一个有争议的问题,虽然由于在综合你不能引用的项目索引。
所以如果你想要锁在名单和数组可以得到小的性能增加。
如果你想要灵活使用foreach和程序的类型.(允许使用的皇宫和/或产量返回)。
在条款的拨款,就会更好看 该博文.它显示了在究竟在什么情况下的一枚举的是分配上的堆。
我认为,一个可能的情况下你 可能会 得到一个的性能增益是如果可枚举的类型的规模和循环的条件是一个恒定不变的;例如:
const int ArraySize = 10;
int[] values = new int[ArraySize];
//...
for (int i = 0; i
在这种情况下,根据复杂的循环机构,编译可能是能够替代循环与联话。我不知道如果.净编译这样做,它的效用有限的规模如果可枚举的类型是动态的。
一种情况 foreach
可能更好地执行与数据结构像联的列表,其中随机访问装置遍表;枚举使用过 foreach
可能会迭代的一个项目的时间,使每个访问O(1)和全环O(n),但调用的索引装置开始,在头和查找项目在正确的指标;O(N)每个环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
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;
}