性能分析循环和foreach

26 浏览
0 Comments

性能分析循环和foreach

在这个帖子中,我们讨论了关于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循环耗时={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循环耗时={0}", stopwatchForeach.Elapsed);
}

然后我运行了上面的代码,结果是foreach循环耗时=00:00:00.0000003,

for循环耗时= 00:00:00.0001462。我认为我们想要高性能的代码。我们会使用foreach。

0
0 Comments

问题的原因:

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

2) 如果你有一个非常大的数据集需要迭代,并且性能是你的主要考虑因素(请记住,除非数据集很大,否则这些数字不会引起注意),那么你可能需要考虑并行化你的代码。这时候问题可能不再是for循环 vs foreach循环,而是Parallel.For vs Parallel.Foreach vs PLINQ(AsParallel()方法)。你可以让不同的线程来处理问题。

解决方法:

1) 如果你在使用可能受到内存压力的框架,使用for循环而不是foreach循环。

2) 如果你有一个非常大的数据集需要迭代,并且性能是你的主要考虑因素,考虑并行化你的代码,使用Parallel.For、Parallel.Foreach或PLINQ(AsParallel()方法)。

在生产应用程序中,循环往往会包含一些逻辑,每次迭代需要一定的时间。一旦将这个因素加入考虑,性能的关注点通常会转移到实际逻辑的优化上(编译器在迭代方面做得很好)。

数十万次迭代不太可能引起明显的性能问题。只有当迭代次数达到数千万甚至数亿次时,才会真正注意到差异。

0