2015-04-03 59 views
2

我一直觉得C#编译器的/ optimize标志没有太大的作用。诸如this one之类的文章描述了IL中相对较少的优化:大部分都归入JIT。然而,最近我试图加速一些CPU密集型代码(想想很多遍历数组和字典以及简单的数字),并且我尝试开启优化只是为了踢。结果是速度提高了3x改进。请注意,这纯粹是通过点击VS项目属性页面中的“优化”复选框。切换DEBUG和TRACE常量没有性能影响。/optimize标志启用哪些运行时优化?

尽管小的IL优化可能会导致这种改变是完全可能的,但这对我来说似乎很令人惊讶。在优化阅读时,我发现这个珍闻在MSDN docs

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

我很好奇这是什么意思。这是否意味着JIT不会优化非优化程序集中的代码?这可以启用什么类型的优化?

+0

http://blogs.msdn.com/b/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx – 2015-04-03 12:53:59

+0

@ DanielA.White:这似乎是集中在IL优化。你能把我指向处理运行时间的部分吗? – ChaseMedallion 2015-04-03 14:15:12

+0

@downvoter:为什么倒戈? – ChaseMedallion 2015-04-03 14:15:26

回答

4

打开项目的Build选项卡中的“优化代码”选项确实是两个的东西。它将/ optimize +选项传递给C#编译器,它执行您已知的次要MSIL优化。但它获取C#编译器在元数据中发出[DebuggableAttribute]属性。你会得到DebuggableAttribute.IsJITOptimizerDisabled设置为虚假

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

调试器也发挥作用,它可以强制优化器本身。相关设置为工具+选项,调试,常规,“抑制JIT优化”复选框。通常打开,所以当你调试时你永远不会得到优化的代码。相当重要的是,经过优化的代码很难调试。当您想查看优化的机器代码时,您希望关闭该选项。

请记住,你做错了什么。 .NET项目的默认版本配置始终已经选中了优化选项。所以你有理由打开它是不合逻辑的。只有剖析.NET项目的Release版本。

+0

从你所说的话来看,这听起来像代码将与优化标志打开或关闭一样可调试。在那种情况下,为什么在迭代和运行单元测试时使用的调试版本中关闭它? – ChaseMedallion 2015-04-04 15:47:58

+0

不,你会失去一些功能,比如不能在{花括号}上设置断点。那些“微小的变化”。单元测试应该只测试Release版本,没有点测试软件在用户机器上的运行方式不同。尽管特定于发布的错误并不常见。虽然使用浮点代码。 – 2015-04-04 16:01:14