C# loop和foreach的性能分析

C# loop和foreach的性能分析,c#,performance,console-application,C#,Performance,Console Application,在本线程中,我们讨论了for循环和foreach的性能分析。 哪一个性能更好-for的或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++)

在本线程中,我们讨论了
for循环
foreach
的性能分析。 哪一个性能更好-for的
或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);
}
publicstaticvoidtestfor()
{
秒表秒表=Stopwatch.StartNew();
int[]myinteger=新的int[1];
int-total=0;
for(int i=0;i
然后我运行上面的代码,结果是foreach循环时间经过=00:00:00.0000003,
循环经过的时间=00:00:00.0001462。我想我们需要高性能的代码。我们将使用foreach

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

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

2) 如果您有一个非常大的迭代集,并且性能是您的关键决策驱动因素(请记住,除非这些数字很大,否则不会引起注意),那么您可能需要考虑并行化代码。因此,不同之处可能不是vs foreach,而是Parallel.for vs Parallel.foreach vs PLINQ(aspallel()方法)。你有不同的线程来解决这个问题


编辑:在生产应用程序中,循环中很可能会有某种逻辑,这将花费>>>时间来迭代某个项。一旦将其添加到混合中,性能驱动程序通常会转移到实际逻辑,而不是优化迭代(编译器做得很好)。

在for循环中,您应该将
myInteger.Length
存储在
for
语句之外,以获得更好的性能。否则它将不得不为每次迭代查询数组的长度。您是否在
TestFor
TestForeach
调用之间调用了
GC.Collect
?我认为,由于垃圾收集,第一个测试可能会影响第二个测试的结果。任何不针对迭代计数运行的性能测试都是可疑的,因为迭代计数会使时间测量达到几秒(如果不是几分钟的话)。太多的可能混淆,可能会增加几分之一秒的虚假时间,以至于无法相信任何运行时间少于5秒的性能测试。多亏了…………几十万次迭代不太可能带来足够的开销。您可能需要迭代数千万或数亿次(如果不是数十亿次的话)才能真正注意到差异。