是否有一个完整的关于/optimize C#编译器选项所做的优化列表可以在任何地方找到?
编辑: 为什么默认情况下该选项被禁用? 在现实世界的应用中使用它是值得的吗? - 它只在调试配置中默认禁用,在发布配置中启用。
是否有一个完整的关于/optimize C#编译器选项所做的优化列表可以在任何地方找到?
编辑: 为什么默认情况下该选项被禁用? 在现实世界的应用中使用它是值得的吗? - 它只在调试配置中默认禁用,在发布配置中启用。
Scott Hanselman有一篇博客文章,展示了/optimize(在发布构建中启用)的一些示例。
总的来说:/optimize会做很多事情,没有确切的数字或定义,但其中一个更明显的是方法内联(如果您有一个调用B()和C()的A()方法,编译器可能会“跳过”B和C,直接从A到D),这可能会导致发布版本中出现“奇怪”的调用堆栈。
在调试版本中,默认情况下它是禁用的。而在发布版本中,则启用了该选项。
启用此开关绝对是值得的,因为编译器根据您的代码类型进行了许多微调和优化。 例如:跳过冗余的初始化、永远不会改变的比较等。
注意:如果您打开优化,可能会遇到一些调试困难,因为您的代码和生成的IL代码可能不匹配。这就是它仅在发布版本中启用的原因。
引用自MSDN页面:
/optimize选项使编译器能够对生成的输出文件进行优化,从而使程序更小、更快、更高效。
换句话说,它确切地做了你想要的事情——优化在.NET虚拟机上执行的编译后的CIL(Common Intermediate Language)代码。你不必担心具体的优化方式是什么,可以肯定的是它们很多,在某些情况下可能相当复杂。如果你真的对它所做的事情感兴趣,可以研究一下Mono C# Compiler(我怀疑MS C#的细节并未公开)。
默认情况下,在“Debug”配置中禁用优化的原因是它会使某些调试功能无法使用。以下是一些值得注意的功能:
事实上,优化的默认选项永远不应该被更改。在调试时关闭该选项非常有用,在发布模式下开启它同样是明智的选择。