在.NET中,“ for”或“ foreach”哪个循环运行得更快?

与世无争的帅哥 提交于 2020-03-16 13:47:50

某厂面试归来,发现自己落伍了!>>>

在C#/ VB.NET / .NET中, forforeach哪个循环运行得更快?

自从我很早以前就读过for循环比foreach循环的运行速度更快以来,我就认为它适用于所有集合,通用集合,所有数组等。

我搜寻了Google并发现了几篇文章,但其中大多数没有定论(阅读文章评论)且开放式。

理想的情况是列出每个方案,并为它们提供最佳解决方案。

例如(仅作为示例):

  1. 对于迭代1000+字符串数组- for好过foreach
  2. 用于遍历IList (非通用)字符串foreachfor更好

在网上找到了一些相同的参考资料:

  1. Emmanuel Schanzer撰写的原始宏大的旧文章
  2. CodeProject FOREACH与。 对于
  3. 博客-要foreach或不foreach ,这是个问题
  4. ASP.NET论坛-NET 1.1 C# for vs foreach

[编辑]

除了可读性之外,我对事实和数据真的很感兴趣。 在某些应用程序中,压缩性能优化的最后一步很重要。


#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

手指越过该结果表明,这种差异可以忽略不计,您最好还是在可维护性最高的代码中执行任何结果

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!