有人告诉我,以下代码块之间存在性能差异.
foreach (Entity e in entityList) { .... }
和
for (int i=0; i哪里
ListentityList; 我不是CLR期望,但从我可以告诉他们应该归结为基本相同的代码.有没有人有这样或那样的混凝土(哎呀,我拿着装满污垢)的证据?
1> Daniel Jenni..:foreach创建一个枚举器的实例(从GetEnumerator返回),该枚举器在整个foreach循环过程中也保持状态.然后,它反复调用枚举器上的Next()对象,并为它返回的每个对象运行代码.
它们不会以任何方式归结为相同的代码,真的,如果您编写自己的枚举器,您会看到它们.
2> David Basara..:这是一篇很好的文章,显示了两个循环之间的IL差异.
Foreach在技术上较慢,但更容易使用和更容易阅读.除非性能至关重要,否则我更喜欢fore循环而不是for循环.
3> 小智..:foreach示例大致对应于此代码:
using(IEnumeratore = entityList.GetEnumerator()) { while(e.MoveNext()) { Entity entity = e.Current; ... } } 这里有两个成本,常规for循环不需要支付:
通过entityList.GetEnumerator()分配枚举器对象的成本.
两个虚方法的成本调用(MoveNext和Current)列表的每个元素.