Performance analyze for loop and foreach
本问题已经有最佳答案,请猛点这里访问。
在本文中,我们讨论了
以下是两种简单的方法:
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()方法)。你有不同的思路来解决这个问题。
编辑:在生产应用程序中,您的循环中很可能会有某种逻辑,这将花费>>>时间来迭代一个项目。一旦将其添加到混合性能驱动程序中,通常会切换到实际的逻辑,而不是优化迭代(编译器做得很好)。