关于c#:针对循环和foreach的性能分析

Performance analyze for loop and foreach

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

在本文中,我们讨论了for loopforeach的性能分析。哪一个性能更好——forforeach

以下是两种简单的方法:

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
 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 loop time elapsed=00:00:00.0000003,循环时间=00:00:00.0001462。我想我们需要高性能代码。我们会用foreach


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

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

2)如果您有一个非常大的集合,您正在迭代,并且性能是您的关键决策驱动因素(请记住,除非这些数字很大,否则不会被注意到),那么您可能需要考虑将代码并行化。差异可能不是针对vs forach,而是针对vs parallel.forach vs plinq(asparallel()方法)。你有不同的思路来解决这个问题。

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