在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

(编辑)

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


当前回答

你可以用一个IQueryable .foreach闭包来代替:

myList.ForEach(c => Console.WriteLine(c.ToString());

其他回答

我的猜测是,在99%的情况下,它可能并不重要,所以为什么要选择更快的,而不是最合适的(最容易理解/维护)?

它将永远接近。对于数组,有时For稍微快一点,但foreach更有表现力,并提供LINQ等。总的来说,坚持使用foreach。

此外,foreach可能在某些情况下进行了优化。例如,一个链表对于indexer来说可能很糟糕,但是对于foreach来说可能很快。实际上,由于这个原因,标准LinkedList<T>甚至没有提供索引器。

每当有关于性能的争论时,您只需要编写一个小测试,以便您可以使用量化结果来支持您的案例。

使用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

幸运的是,这样做的结果表明差异可以忽略不计,您还可以在最可维护的代码中执行任何结果

For有更简单的逻辑实现,所以它比foreach快。

我认为使用Parallel.ForEach()以及ConcurrentDictionary或ConcurrentBag会更快

下面是Parallel.ForEach()的例子

        var primeNumbers = new ConcurrentBag<T>();
        Parallel.ForEach(numbers, number =>
        {
            if (IsPrime(number))
            {
                primeNumbers.Add(number);
            }
        });

And

 var productImage = new ConcurrentDictionary<int,ResultModel>();
  Parallel.ForEach(pendingActiveImagesBatch, pictureItem =>
  {                           
     productImage.TryAdd(pictureItem.Id,pictureItem));
  });

引用平行。ForEach 参考ConcurrentDictionary最后