当我对代码进行基准测试时,我注意到第一次运行太慢而下一次运行速度太快。是什么原因?
for (int i = 0; i < 10; i++)
{
var timer = new Stopwatch();
timer.Start();
var expression = new Expression('x');
Console.WriteLine(timer.ElapsedTicks);
}
结果
15096
6
0
1
1
1
1
1
0
有没有办法在第一次运行时始终获得最大速度?
答案 0 :(得分:4)
您正在测量抖动开销。及时。在Expression的情况下,它主要是磁盘开销,它的ngen-ed代码需要从System.Core.ni.dll文件加载到RAM中。或者换句话说,您正在测量硬页面错误的成本。它将保持驻留一段时间,这就是为什么它在第二次以及随后你调用它的构造函数时会很快。
不,你总是需要支付这笔费用。
答案 1 :(得分:2)
我认为这是因为C#是一种“ 及时编译 ”语言。
我希望在第一次迭代时,代码会动态编译到机器特定代码中,并放入缓存。对于下一次迭代,编译代码的开销不再存在,因为已编译的代码从缓存中取出。
可能还有其他原因与缓存变暖有关,但可能是第一个原因是原因。
答案 2 :(得分:-2)
您应该重复使用计时器并使用Stop功能才能正确使用计时器。
即。类似的东西:
var timer = new Stopwatch();
for (int i = 0; i < 10; i++)
{
timer.Start();
var expression = new Expression('x');
timer.Stop();
Console.WriteLine(timer.ElapsedTicks);
timer.Reset();
}