第一轮和第二轮之间的速度差异

时间:2015-04-26 15:03:53

标签: c# performance benchmarking

当我对代码进行基准测试时,我注意到第一次运行太慢而下一次运行速度太快。是什么原因?

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

有没有办法在第一次运行时始终获得最大速度?

3 个答案:

答案 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();
 }