性能分析循环和foreach
性能分析循环和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。
问题的原因:
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()方法)。
在生产应用程序中,循环往往会包含一些逻辑,每次迭代需要一定的时间。一旦将这个因素加入考虑,性能的关注点通常会转移到实际逻辑的优化上(编译器在迭代方面做得很好)。
数十万次迭代不太可能引起明显的性能问题。只有当迭代次数达到数千万甚至数亿次时,才会真正注意到差异。