什么是/ optimize C#编译器密钥用于?

时间:2009-06-09 10:01:08

标签: c# optimization compiler-construction

是否有完整的/optimize C# compiler key完成的优化列表?

编辑: 为什么默认禁用? 是否值得在真实世界的应用程序中使用? - 默认情况下仅在调试配置中禁用它并在发布中启用。

3 个答案:

答案 0 :(得分:7)

Scott Hanselman has a blog post显示了什么/优化(在发布版本中启用)的一些示例。

作为总结:/ optimize做了许多没有给出确切数字或定义的东西,但其中一个更明显的是方法内联(如果你有一个方法A()调用B()调用C()调用D(),编译器可以“跳过”B和C并直接从A转到D),这可能会导致Release版本中出现“怪异”的callstack。

答案 1 :(得分:2)

默认情况下,调试版本禁用它。对于Release版本,它已启用。

绝对值得启用此开关,因为编译器会根据您拥有的代码类型进行大量调整和优化。 例如:跳过冗余初始化,从不改变的比较等。

注意:如果启用优化作为您拥有的代码和生成的IL代码可能不匹配,则可能会遇到一些调试困难。这就是它仅为Release版本打开的原因。

答案 2 :(得分:2)

引自MSDN page

  

/ optimize选项启用或   禁用由...执行的优化   编译器来制作你的输出文件   更小,更快,更高效。

换句话说,它完全符合您的想法 - 优化由.NET VM执行的已编译CIL(通用中间语言)代码。我不担心具体的优化是什么 - 足以说它们很多,在某些情况下可能相当复杂。如果你真的对它做了什么样的事情感兴趣,你可能会调查Mono C# Compiler(我怀疑有关MS C#的详细信息是公开的)。

Debug 配置默认禁用优化的原因是它使某些调试功能无法进行。一些值得注意的:

  • 也许最重要的是,编辑并继续功能被禁用 - 即在执行期间不修改代码。
  • 打破执行通常意味着突出显示错误的代码行(通常是预期代码之后的代码)。
  • 实际上未分配或甚至声明未使用的局部变量。

实际上,优化的默认选项永远不应该改变。选择关闭以进行调试非常有用,而将其置于发布模式同样明智。