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秒的性能测试。多亏了…………几十万次迭代不太可能带来足够的开销。您可能需要迭代数千万或数亿次(如果不是数十亿次的话)才能真正注意到差异。