关于c#:哪个更快:for或foreach

which is faster: for or foreach

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
For vs Foreach loop in C#

假设我有一个收藏

List < Foo > list = new List< Foo >();

现在,哪个愚弄的循环会运行得更快,为什么:

for(int i=0; i< list.Count; i++)

foreach(Foo foo in list)


这取决于:

对于for循环,它在How much time does it take to evaluate the value of列表中。countor whatever value is provided in conditionHow much time does it take to reference item at specific index中。

对于Foreach环,它依赖于How much time it takes for an iterator to return a value

对于上面的示例,不应该有任何区别,因为您使用的是标准列表类。


foreach对我来说打字更快:)而且更容易阅读。


谁在乎?您有性能问题吗?如果是这样,您是否测量并确定这是应用程序中最慢的部分?


尝试此方法,for和foreach几乎同时产生结果,但是.foreach()方法更快

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Program
{
    static void Main(string[] args)
    {
        //Add values
        List<objClass> lst1 = new List<objClass>();
        for (int i = 0; i < 9000000; i++)
        {
            lst1.Add(new objClass("1",""));
        }

        //For loop
        DateTime startTime = DateTime.Now;
        for (int i = 0; i < 9000000; i++)
        {
            lst1[i]._s1 = lst1[i]._s2;
        }
        Console.WriteLine((DateTime.Now - startTime).ToString());

        //ForEach Action
        startTime = DateTime.Now;
        lst1.ForEach(s => { s._s1 = s._s2; });
        Console.WriteLine((DateTime.Now - startTime).ToString());

        //foreach normal loop
        startTime = DateTime.Now;
        foreach (objClass s in lst1)
        {
            s._s1 = s._s2;
        }
        Console.WriteLine((DateTime.Now - startTime).ToString());

    }

    public class objClass
    {
        public string _s1 { get; set; }
        public string _s2 { get; set; }

        public objClass(string _s1, string _s2)
        {
            this._s1 = _s1;
            this._s2 = _s2;
        }
    }

}

好。。你可以用System.Diagnostics.StopWatch找到答案。

然而,关键是,为什么你需要考虑它。在本例中,您应该首先考虑哪个更易于阅读,并使用那个,而不是担心性能。

如果发现性能问题,黄金法则总是编写可读的代码并进行优化。


如果需要使用当前项的索引,请使用for循环。没有faster解决方案,您只有proper解决方案。


我没有可以支持这一点的源代码,但我相信它们几乎完全相同,这是因为编译器执行优化(如循环展开)的方式。如果存在差异,则可能是单CPU周期或数十个CPU周期的顺序,对于99.9999%的应用程序来说,这几乎是零。

一般来说,foreach被认为是"句法上的糖",也就是说,拥有它是很好的,但是除了改变你对特定代码的表达方式之外,它实际上没有做太多的工作。