2013-03-17 40 views
-3

在这个线程中,我们讨论了关于for loopforeach的性能分析。 哪一个可以提供更好的性能 - forforeach循环和foreach的性能分析

这里有两种简单的方法:

public static void TestFor() 
{ 

    Stopwatch stopwatch = Stopwatch.StartNew(); 
    int[] myInterger = new int[1]; 
    int total = 0; 
    for (int i = 0; i < myInterger.Length; i++) 
    { 
     total += myInterger[i]; 
    } 
    stopwatch.Stop(); 
    Console.WriteLine("for loop Time Elapsed={0}", stopwatch.Elapsed); 
} 
public static void TestForeach() 
{ 
    Stopwatch stopwatchForeach = Stopwatch.StartNew(); 
    int[] myInterger1 = new int[1]; 
    int totall = 0; 
    foreach (int i in myInterger1) 
    { 
     totall += i; 
    } 

    stopwatchForeach.Stop(); 
    Console.WriteLine("foreach loop Time Elapsed={0}", stopwatchForeach.Elapsed); 
} 

然后我跑的上面的代码的结果是foreach循环时间已= 00:00:00.0000003, for循环时间已= 00:00:00.0001462。我认为我们需要高性能的代码。我们将使用foreach

+0

在for循环中,您应该在'for'语句之外存储'myInteger.Length'以获得更好的性能。否则,它将不得不查询每次迭代的数组长度。 – ryan 2013-03-17 14:58:49

+0

您是否在'TestFor'和'TestForeach'调用之间调用'GC.Collect'?我认为第一次测试可能会影响第二次垃圾回收的结果。 – user20140268 2013-03-17 15:05:36

+0

任何没有运行的性能测试都会导致时间测量长达数秒(如果不是几分钟),这种迭代计数是可疑的。你太可怕了,可能会增加几十分之一秒的误会,相信任何性能测试的整体运行时间不到5秒钟。 – 2013-03-17 16:09:34

回答

1

我的决定不会基于这样一个简单的性能循环。我假设你经常使用循环/大型数据集。直到我们开始谈论数十万次(至少)的迭代时,才会注意到这种差异。 1)如果您正在编写具有潜在内存压力的框架(XBOX,Windows Phone,Silverlight)的应用程序。我会使用for循环,因为foreach可以留下可以留下来收集的轻量级“垃圾”。几年前我在做游戏的XBOX开发时,一个常见的技巧是使用for循环初始化屏幕上显示的固定数组项目,并将其保存在内存中,然后不必担心垃圾收集/内存调整/垃圾回收等。如果你有一个这样的循环叫60+次/秒(即游戏)

2)如果你有一个非常大的集合,你正在迭代和性能是你的关键决策驱动程序(记住,除非这些数字很大,否则这些数字不会被注意到),那么您可能需要考虑并行化代码。然后区别可能不是对于foreach,但Parallel.For与Parallel.Foreach与PLINQ(AsParallel()方法)。你有不同的线程来解决这个问题。

编辑:在生产应用程序中,您很可能会在循环中使用某些逻辑,这需要>>>时间来迭代项目。一旦你添加到混合性能驱动程序通常转向实际的逻辑没有优化迭代(编译器做得很好)。

+0

成千上万的迭代不太可能足够的开销是显而易见的。您可能需要重复数十亿甚至数亿次,即使不是数十亿次,才能真正发现差异。 – Servy 2013-03-18 15:57:41