C#,For循环和速度测试......第二次完全相同的循环更快?

Pro*_*ool 4 c# arrays foreach loops for-loop

public Int64 ReturnDifferenceA()
{
  User[] arrayList;
  Int64 firstTicks;
  IList<User> userList;
  Int64 secondTicks;
  System.Diagnostics.Stopwatch watch;

  userList = Enumerable
              .Range(0, 1000)
              .Select(currentItem => new User()).ToList();

  arrayList = userList.ToArray();

  watch = new Stopwatch();
  watch.Start();

  for (Int32 loopCounter = 0; loopCounter < arrayList.Count(); loopCounter++)
  {
     DoThings(arrayList[loopCounter]);
  }

  watch.Stop();
  firstTicks = watch.ElapsedTicks;

  watch.Reset();
  watch.Start();
  for (Int32 loopCounter = 0; loopCounter < arrayList.Count(); loopCounter++)
  {
     DoThings(arrayList[loopCounter]);
  }
  watch.Stop();
  secondTicks = watch.ElapsedTicks;

  return firstTicks - secondTicks;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这非常简单.创建用户列表,强制使用数组,启动监视,循环列表并调用方法,停止监视.重复.通过返回第一次运行和第二次运行的差异来完成.

现在我打电话给这些:

differenceList = Enumerable
                 .Range(0, 50)
                 .Select(currentItem => ReturnDifferenceA()).ToList();
average = differenceList.Average();

differenceListA = Enumerable
                  .Range(0, 50)
                  .Select(currentItem => ReturnDifferenceA()).ToList();
averageA = differenceListA.Average();

differenceListB = Enumerable
                  .Range(0, 50)
                  .Select(currentItem => ReturnDifferenceA()).ToList();
averageB = differenceListB.Average();
Run Code Online (Sandbox Code Playgroud)

现在有趣的是,所有平均值都是相对较大的正数,范围从150k到300k.

我没有得到的是,我使用相同的方法以相同的方式浏览相同的列表但是存在这样的差异.是否有某种缓存?

另一个有趣的事情是,如果我在第一个秒表部分之前迭代列表,平均值大约是5k左右.

Kar*_*arl 5

您使用高级语言运行,运行时环境可以执行大量缓存和性能优化,这很常见.有时它被称为预热虚拟机或预热服务器(当它是生产应用程序时).

如果要重复进行某些操作,那么您会经常注意到第一次测量的运行时间较大,其余的应该调整到较小的量.

我在MATLAB代码中执行此操作,并且看到我第一次运行基准测试循环时,需要五秒钟,后续时间需要五分之一秒.这是一个巨大的差异,因为它是一种需要某种形式的编译的解释语言,但实际上,它并不影响你的表现,因为绝大多数将是"第二次在任何生产应用程序中.