为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

杨__羊羊 2019-06-24 10:30:39

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

在运行速度更快的C#/VB.NET/.NET中,forforeach?

自从我读到for循环的工作速度比foreach环a很久以前我认为它适用于所有集合、泛型集合、所有数组等。

我搜索了谷歌,发现了一些文章,但大多数都是不确定的(阅读文章的评论)和开放式的文章。

理想的做法是列出每个场景,并为其提供最佳解决方案。

例如(仅仅是它应该如何的一个例子):

  1. 用于迭代1000多个字符串的数组-

    for

    foreach

  2. 用于迭代

    IList

    (非属)字符串-

    foreach

    for

在网上也可以找到一些相同的参考资料:

  1. 伊曼纽尔·尚泽尔的原创古旧文章

  2. CodeProject FOREACH VS.为

  3. 博客-toforeach还是不去foreach,这就是问题所在

  4. ASP.NET论坛-NET1.1 C#forVSforeach


[编辑]

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


查看完整描述

3 回答

?
繁花如伊

帕特里克·斯马奇亚在博客上写到上个月,有以下结论:

  • 对于列表上的循环,比列表中的foreach循环要便宜2倍多。
  • 数组上的循环比列表上的循环要便宜大约2倍。
  • 因此,使用for对数组进行循环比使用foreach在列表上循环要便宜5倍(我相信,我们都是这样做的)。


查看完整回答
反对 回复 2019-06-24
?
哈士奇WWW

foreach循环比for.

使用foreach循环向使用您的代码的任何人演示,您计划对集合的每个成员做一些事情,而不管它在集合中的位置如何。它还显示您没有修改原始集合(如果尝试,则抛出异常)。

另一个优势是foreach它适用于任何IEnumerable,在哪里for只对IList,其中每个元素实际上都有一个索引。

但是,如果您需要使用元素的索引,那么当然应该允许您使用for循环。但是,如果您不需要使用索引,那么使用索引就会使代码变得杂乱无章。

据我所知,没有明显的性能影响。在将来的某个阶段,使用foreach在多个核上运行,但现在不需要担心。


查看完整回答
反对 回复 2019-06-24
?
潇潇雨雨

首先,反诉德米特里的回答..对于数组,C#编译器发出的代码基本相同foreach就像等价物一样for循环。这就解释了为什么对于这个基准,结果基本上是一样的:

using System;using System.Diagnostics;using System.Linq;class Test{
    const int Size = 1000000;
    const int Iterations = 10000;

    static void Main()
    {
        double[] data = new double[Size];
        Random rng = new Random();
        for (int i=0; i < data.Length; i++)
        {
            data[i] = rng.NextDouble();
        }

        double correctSum = data.Sum();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j=0; j < data.Length; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum-correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in data)
            {
                sum += d;
            }
            if (Math.Abs(sum-correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop: {0}", sw.ElapsedMilliseconds);
    }}

结果:

For loop: 16638Foreach loop: 16529

接下来,验证Greg关于集合类型重要的地方-将数组更改为List<double>在上面,你得到了完全不同的结果。它不仅在一般情况下显着慢,而且比按索引访问要慢得多。话虽如此,我还是会几乎总是比起for循环,它更倾向于使代码更简单-因为可读性几乎总是很重要,而微观优化很少。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 809 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信