执行前预编译C#方法

Fir*_*ock 6 c# load-testing

我像这样测量代码速度:

var sw = new Stopwatch();
sw.Start();
DoSomething();
sw.Stop();
AddLog("Method speed is (ms): "+sw.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)

但是DoSomething()的第一次调用很慢,因为代码正在编译.解决方法是测量第二次调用的速度,如下所示:

var sw = new Stopwatch();
DoSomething();
sw.Start();
DoSomething();
sw.Stop();
AddLog("Method speed is (ms): "+sw.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)

是否可以在没有第一次调用的情况下预编译DoSomethig()?

SKl*_*ous 0

您看到这种时间差异的原因是因为运行时正在编译第一次调用之前执行的方法,而当即将第二次调用时,运行该方法所需的所有内容都已编译完毕。您可以使用ngen.exe来完成此任务。它在执行之前将 il 编译为本机 exe,并会减少启动时间。

对于您的特定场景,我相信 ngen.exe 是适合该工作的工具,因为它可以作为构建后事件触发,以提前编译您的程序集并在需要时做好准备。如果您使用PrepareMethod,那么当您运行测试时,您仍然会延迟 JITing 方法,只是在实际调用它们时不会。