C# 第一次运行和第二次运行之间的速度差

C# 第一次运行和第二次运行之间的速度差,c#,performance,benchmarking,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); } 有没有什么方法可以在第一次运行时始终获得最大的速度?我认为这是因为C是一

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

for (int i = 0; i < 10; i++)
{
    var timer = new Stopwatch();
    timer.Start();
    var expression = new Expression('x');
    Console.WriteLine(timer.ElapsedTicks);
}

有没有什么方法可以在第一次运行时始终获得最大的速度?

我认为这是因为C是一种即时编译语言

我希望在第一次迭代中,代码被动态编译成特定于机器的代码,并放入缓存中。对于下一次迭代,编译代码的开销不再存在,因为编译后的代码已从缓存中取出


缓存变暖可能还有其他原因,但第一个原因可能就是原因。

为了正确使用计时器,您应该重新使用计时器并使用停止功能

i、 e.类似于此:

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

您正在测量头顶上的抖动。来得正是时候。对于表达式,这主要是磁盘开销,它的ngen ed代码需要从System.Core.ni.dll文件加载到RAM中。或者换句话说,您正在衡量硬页面错误的成本。它将驻留一段时间,这就是为什么在第二次和以后调用其构造函数时它会很快


不,您必须始终支付此费用。

您正在实例化哪个表达式类?System.Linq.Expressions中的一个是抽象的,我找不到任何其他具有接受char参数的构造函数的类。没有那个名为expression的自定义类。我将它命名为expression。@JacobBundgaard,不要忘记计时器。重新启动:
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();
 }