在C#/ VB.NET / .NET中, for
或foreach
哪个循环运行得更快?
自从我很早以前就读过for
循环比foreach
循环的运行速度更快以来,我就认为它适用于所有集合,通用集合,所有数组等。
我搜寻了Google并发现了几篇文章,但其中大多数没有定论(阅读文章评论)且开放式。
理想的情况是列出每个方案,并为它们提供最佳解决方案。
例如(仅作为示例):
- 对于迭代1000+字符串数组-
for
好过foreach
- 用于遍历
IList
(非通用)字符串foreach
比for
更好
在网上找到了一些相同的参考资料:
- Emmanuel Schanzer撰写的原始宏大的旧文章
- CodeProject FOREACH与。 对于
- 博客-要
foreach
或不foreach
,这是个问题 - ASP.NET论坛-NET 1.1 C#
for
vsforeach
[编辑]
除了可读性之外,我对事实和数据真的很感兴趣。 在某些应用程序中,压缩性能优化的最后一步很重要。
#1楼
Jeffrey Richter在TechEd 2005上:
“多年来,我已经开始学习C#编译器对我来说是个骗子。” ..“这取决于很多事情。” ..“就像当您执行一个foreach循环时一样...” ..“ ...那是您编写的一小段代码,但是C#编译器为了做到这一点而吐出的东西却是惊人的。 try / finally块,在finally块内,将变量转换为IDisposable接口,如果转换成功,则在其上调用Dispose方法,在循环内,它在循环内重复调用Current属性和MoveNext方法,对象在幕后创建。很多人使用foreach,因为它非常容易编码,很容易做..“ ..” foreach在性能上不是很好,如果您遍历集合而不是使用正方形括号表示法,只是做索引,这要快得多,而且不会在堆上创建任何对象...”
点播网络广播: http : //msevents.microsoft.com/CUI/WebCastEventDetails.aspx? EventID=1032292286& EventCategory=3& culture= en -US&CountryCode= US
#2楼
与for
循环相比for
foreach
循环表现出更具体的意图 。
使用foreach
循环会向使用您的代码的任何人证明您计划对集合的每个成员执行某项操作,无论其在集合中的位置如何。 它还显示您没有修改原始集合(如果尝试修改,则会引发异常)。
的另一个优点foreach
是,它适用于任何IEnumerable
,其中作为for
唯一有意义IList
,其中每个元素实际上有一个索引。
但是,如果您需要使用元素的索引,那么当然应该允许您使用for
循环。 但是,如果您不需要使用索引,那么拥有索引只会使您的代码混乱。
据我所知,对性能没有重大影响。 在将来的某个阶段,使用foreach
修改代码以在多个内核上运行可能会更容易,但是现在不必担心。
#3楼
在使用对象集合的情况下, foreach
更好,但是如果增加数字,则for
循环会更好。
请注意,在最后一种情况下,您可以执行以下操作:
foreach (int i in Enumerable.Range(1, 10))...
但是它的性能肯定不会更好,实际上与for
相比,它的性能更差。
#4楼
两者将以几乎完全相同的方式运行。 编写一些代码以同时使用它们,然后向他显示IL。 它应该显示可比的计算,这意味着性能没有差异。
#5楼
每当有关于性能的争论时,您只需要编写一个小型测试即可使用定量结果来支持您的案例。
使用StopWatch类,并重复几百万次,以确保准确性。 (如果没有for循环,这可能很难):
using System.Diagnostics;
//...
Stopwatch sw = new Stopwatch()
sw.Start()
for(int i = 0; i < 1000000;i ++)
{
//do whatever it is you need to time
}
sw.Stop();
//print out sw.ElapsedMilliseconds
手指越过该结果表明,这种差异可以忽略不计,您最好还是在可维护性最高的代码中执行任何结果
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3195909