有没有什么办法可以改变.NET JIT编译器的性能,而不是编译时间?



performance clr (1)

我想知道是否有任何方法来改变.NET JIT编译器的行为,通过指定更深入的优化的偏好。 否则,如果它可以做一些配置文件引导的优化,如果它还没有,那将是很好的。


Answer #1

这是编译你的程序集时设置的。 有两种类型的优化:

  • IL优化
  • JIT原生代码质量。

默认设置是这样的

 /optimize- /debug-

这意味着未优化的IL和优化的本地代码。

 /optimize /debug(+/full/pdbonly) 

这意味着未优化的IL和未优化的本机代码(最佳调试设置)。

最后,要获得最快的表现:

/optimize+ /debug(-/+/full/pdbonly)

这产生了优化的IL和优化的本地代码。

当生成未优化的IL时,编译器将在整个代码中插入NOP指令。 这使得代码更易于调试,允许在控制流指令(例如,while,if,else,try,catch等)上设置断点。

无论如何,CLR在优化代码方面做得非常好。 一旦一个方法被JIT化,一个call或callvirt指令上的指针直接指向本地代码。

另外,CLR将会在使用代码时利用任何可用的架构技巧。 这意味着通过JIT运行的程序集运行速度比使用Ngen预编译的程序集运行得快(尽管启动时间稍微慢一点),因为NGen将针对所有平台进行编译,而不会利用任何技巧。





ngen