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