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

是否有/ optimize C#编译器密钥可以在任何地方完成的完整优化列表?

编辑: 为什么默认禁用? 是否值得在真实世界的应用程序中使用? – 默认情况下仅在“调试”配置中禁用,在“释放”中启用。

Scott Hanselman有一篇博客文章 ,其中展示了/ optimize(在发布版本中启用)的一些示例。

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

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

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

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

引自MSDN页面 :

/ optimize选项启用或禁用编译器执行的优化,以使输出文件更小,更快,更高效。

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

默认情况下,对Debug配置禁用优化的原因是它使某些调试function无法进行。 一些值得注意的:

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

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