/ optimize标志启用了哪些运行时优化?

时间:2015-04-03 12:50:37

标签: c# performance optimization compiler-optimization jit

我一直认为C#编译器的/ optimize标志不会做太多。像this one这样的文章描述了如何在IL中进行相对较少的优化:大多数都被降级为JIT。

然而,最近我试图加速一些CPU密集型代码(想想大量的迭代数组和字典以及简单的数字),我尝试开启优化只是为了踢。结果是速度提高<3倍。请注意,这纯粹是通过单击VS项目属性页面中的“优化”复选框。切换DEBUG和TRACE常量没有性能影响。

尽管小型IL优化完全有可能导致这种变化,但这对我来说似乎非常令人惊讶。阅读优化,我在MSDN docs

中找到了这个小窍门
  

/ optimize还告诉公共语言运行库优化代码   运行时。

我很好奇这意味着什么。这是否意味着JIT不对非优化程序集中的代码进行优化?这启用了哪些优化?

1 个答案:

答案 0 :(得分:6)

启用&#34;优化代码&#34;项目的“构建”选项卡中的选项可以执行两个项。它将/ optimize +选项传递给C#编译器,它执行您已经知道的次要MSIL优化。但它让C#编译器在元数据中发出[DebuggableAttribute]属性。并且您将DebuggableAttribute.IsJITOptimizerDisabled设置为 false

抖动使用它来决定是否要启用优化器。所以,是的,你现在已经启用它并获得3倍的加速并不罕见。

调试器也起作用,它可以强制关闭优化器。相关设置是工具+选项,调试,常规,&#34;抑制JIT优化&#34;复选框。通常打开,以便在调试时永远不会获得优化的代码。非常重要的是,优化的代码很难调试。当您想要查看优化的机器代码时,您希望关闭该选项。

请记住,你做错了什么。 .NET项目的默认版本配置始终已选中优化选项。因此,您有理由将其打开是不合逻辑的。只讨论.NET项目的Release版本。

相关问题