在c# / VB.NET/。哪个循环运行得更快,for还是foreach?
自从很久以前我读到for循环比foreach循环工作得快,我就认为它适用于所有集合、泛型集合、所有数组等。
我搜索了谷歌,找到了几篇文章,但大多数都是不确定的(阅读文章评论),而且是开放式的。
理想的情况是列出每种情况以及最佳解决方案。
例如(这只是一个例子):
用于迭代1000+的数组
字符串- for比foreach好
对于迭代IList(非泛型)字符串- foreach更好
比
在网上找到了一些相同的参考资料:
由Emmanuel Schanzer撰写的原创文章
CodeProject FOREACH Vs. FOR
博客——去博客还是不去博客,这是个问题
ASP。NET论坛- NET 1.1 c# for vs foreach
(编辑)
除了可读性之外,我对事实和数据真的很感兴趣。在某些应用中,最后一英里的性能优化确实很重要。
这和大多数“哪个更快”的问题有相同的两个答案:
1)如果你不测量,你就不知道。
2)(因为…)视情况而定。
这取决于“MoveNext()”方法的代价,相对于“this[int index]”方法的代价,对于你要迭代的IEnumerable的类型(或类型)。
“foreach”关键字是一系列操作的简写——它在IEnumerable上调用GetEnumerator()一次,每次迭代调用MoveNext()一次,它做一些类型检查,等等。最可能影响性能度量的是MoveNext()的成本,因为它被调用了O(N)次。可能便宜,但也可能不便宜。
“for”关键字看起来更容易预测,但在大多数“for”循环中,你会发现类似“collection[index]”这样的东西。这看起来像是一个简单的数组索引操作,但它实际上是一个方法调用,其开销完全取决于迭代的集合的性质。可能便宜,但也可能不便宜。
如果集合的底层结构本质上是一个链表,MoveNext是非常便宜的,但是索引器可能有O(N)成本,使得“for”循环的真正成本为O(N*N)。
我遇到了一个案子,foreach比For快得多
为什么foreach在读取richtextbox行时比for循环快
我有一个类似于那个问题中的OP的案例。
A textbox reading about 72K lines, and I was accessling the Lines property(which is actually a getter method). (And apparently often in winforms there are getter methods that aren't O(1). I suppose it's O(n), so the larger the textbox the longer it takes to get a value from that 'property'. And in the for loop I had as the OP there had for(int i=0;i<textBox1.lines.length;i++) str=textBox1.Lines[i] , and it was really quite slow as it was reading the entire textbox each time it read a line plus it was reading the entire textbox each time it checked the condition.
Jon Skeet演示了您可以只访问一次Lines属性(甚至不是每次迭代一次,只是一次)。而不是每次迭代两次(这是大量的次数)。Do string[] strarlines = textBox1.Lines;然后在星线间循环。
但是一个直观形式的for循环访问Lines属性是非常低效的
for (int i = 0; i < richTextBox.Lines.Length; i++)
{
s = richTextBox.Lines[i];
}
对于文本框,或者富文本框,它非常慢。
OP在一个富文本框上测试了这个循环,发现“有15000行。For循环花了8分钟才循环到15000行。而foreach只花了不到一秒钟的时间来列举它。”
那个链接的OP发现这个foreach比上面提到的他(同一个OP)的for循环要有效得多。就像我一样。
String s=String.Empty;
foreach(string str in txtText.Lines)
{
s=str;
}