第一个 运行 和第二个 运行 之间的速度差异
Speed difference between first run and second run
当我对我的代码进行基准测试时,我注意到第一个 运行 太慢而接下来的 运行 太快。这是什么原因?
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
有什么方法可以在一开始就始终获得最大速度运行?
我认为这是因为 C# 是一种“及时编译”的语言。
我希望在第一次迭代时,代码被动态编译成 机器特定代码,并放入缓存 。对于下一次迭代,编译代码的开销不再存在,因为编译后的代码已从缓存中取出。
可能还有其他原因与缓存变暖有关,但可能是第一个原因。
您应该重复使用定时器并利用停止功能以正确使用定时器。
即与此类似的内容:
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();
}
您正在测量抖动开销。及时。对于 Expression,它主要是磁盘开销,它的 ngen-ed 代码需要从 System.Core.ni.dll 文件加载到 RAM 中。或者换句话说,您正在衡量硬页面错误的成本。它会驻留一段时间,这就是为什么它在您第二次和随后调用其构造函数时速度很快的原因。
不,你总是要支付这笔费用。
当我对我的代码进行基准测试时,我注意到第一个 运行 太慢而接下来的 运行 太快。这是什么原因?
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
有什么方法可以在一开始就始终获得最大速度运行?
我认为这是因为 C# 是一种“及时编译”的语言。
我希望在第一次迭代时,代码被动态编译成 机器特定代码,并放入缓存 。对于下一次迭代,编译代码的开销不再存在,因为编译后的代码已从缓存中取出。
可能还有其他原因与缓存变暖有关,但可能是第一个原因。
您应该重复使用定时器并利用停止功能以正确使用定时器。
即与此类似的内容:
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();
}
您正在测量抖动开销。及时。对于 Expression,它主要是磁盘开销,它的 ngen-ed 代码需要从 System.Core.ni.dll 文件加载到 RAM 中。或者换句话说,您正在衡量硬页面错误的成本。它会驻留一段时间,这就是为什么它在您第二次和随后调用其构造函数时速度很快的原因。
不,你总是要支付这笔费用。