我一直认为C#编译器的/ optimize标志不会做太多。像this one这样的文章描述了如何在IL中进行相对较少的优化:大多数都被降级为JIT。
然而,最近我试图加速一些CPU密集型代码(想想大量的迭代数组和字典以及简单的数字),我尝试开启优化只是为了踢。结果是速度提高<3倍。请注意,这纯粹是通过单击VS项目属性页面中的“优化”复选框。切换DEBUG和TRACE常量没有性能影响。
尽管小型IL优化完全有可能导致这种变化,但这对我来说似乎非常令人惊讶。阅读优化,我在MSDN docs:
中找到了这个小窍门/ optimize还告诉公共语言运行库优化代码 运行时。
我很好奇这意味着什么。这是否意味着JIT不对非优化程序集中的代码进行优化?这启用了哪些优化?
答案 0 :(得分:6)
启用&#34;优化代码&#34;项目的“构建”选项卡中的选项可以执行两个项。它将/ optimize +选项传递给C#编译器,它执行您已经知道的次要MSIL优化。但它也让C#编译器在元数据中发出[DebuggableAttribute]属性。并且您将DebuggableAttribute.IsJITOptimizerDisabled设置为 false 。
抖动使用它来决定是否要启用优化器。所以,是的,你现在已经启用它并获得3倍的加速并不罕见。
调试器也起作用,它可以强制关闭优化器。相关设置是工具+选项,调试,常规,&#34;抑制JIT优化&#34;复选框。通常打开,以便在调试时永远不会获得优化的代码。非常重要的是,优化的代码很难调试。当您想要查看优化的机器代码时,您希望关闭该选项。
请记住,你做错了什么。 .NET项目的默认版本配置始终已选中优化选项。因此,您有理由将其打开是不合逻辑的。只讨论.NET项目的Release版本。