循环和foreach的性能分析

时间:2013-03-17 14:55:02

标签: c# performance console-application

在这个主题中,我们讨论了for loopforeach的性能分析。 哪一个提供了更好的效果 - forforeach

以下是两种简单的方法:

 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循环Time Elapsed = 00:00:00.0000003, for循环时间Elapsed = 00:00:00.0001462。我想我们想要高性能的代码。我们会使用foreach

1 个答案:

答案 0 :(得分:1)

我的决定不会基于这样的简单性能循环。我假设你经常使用循环/大数据集。在我们开始讨论成千上万的迭代(至少)之前,你不会注意到差异。

1)如果您正在编写具有潜在内存压力框架的应用程序(XBOX,Windows Phone,Silverlight)。我会使用for循环,因为foreach可以留下轻量级的“垃圾”,可以留下来收集。当我几年前在游戏中进行XBOX开发时,一个常见的技巧是使用for循环初始化屏幕上显示的固定数组项目,并将其保留在内存中,然后您不必担心垃圾收集/内存调整/垃圾收集等。这可能是一个问题,如果你有一个这样的循环称为60+次/秒(即游戏)

2)如果你有一个非常大的集合你正在迭代并且性能是你的关键决策驱动程序(记住这些数字不会很明显,除非它们很大),那么你可能想看看你的代码的并行化。然后差异可能不是vs foreach,而是Parallel.For vs Parallel.Foreach vs PLINQ(AsParallel()方法)。你有不同的线程解决问题。

编辑:在生产应用程序中,您很可能会在循环中使用某种逻辑,这将采用&gt;&gt;&gt;迭代一个项目的时间。一旦你将它添加到混合性能驱动程序中,通常会转换到实际的逻辑而不是优化迭代(编译器做得很好)。