2009-06-09 46 views
8

/optimize C# compiler key是否有完整的优化列表可供您使用?什么是/优化C#编译器密钥的目的?

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

+2

6月11日我会在我的博客上回答这个问题(常问!)。 – 2009-06-09 14:56:16

+2

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx – 2009-06-11 15:24:32

回答

7

Scott Hanselman has a blog post显示什么/优化(在发布版本中启用)的一些示例。 ()如果你有一个方法A(),它调用B()调用C(),它是调用D(),编译器可能会“跳过”B和C,并直接从A到D),这可能会在Release版本中导致“奇怪”的调用堆栈。

2

它在默认情况下被禁用,用于调试版本。对于发布版本,它已启用。

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

注意:如果开启优化作为代码和生成的IL代码可能不匹配,那么调试可能会遇到一些困难。这是仅为发布版本打开的原因。

+0

哦的确如此。我会更新这个问题。但我仍然想知道什么是精确的(或足够的)优化列表... – 2009-06-09 10:18:10

2

MSDN page引用:

的/优化选项启用或禁用 通过 编译器进行优化,使您的输出文件 更小,更快,更高效。

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

默认情况下禁用原因优化调试配置是它使某些调试功能不可能。几个显着的:

  • 也许最关键的是,在编辑并继续功能是禁用的 - 即在执行过程中不修改代码。
  • 中断执行通常意味着错误的代码行突出显示(通常是预期的代码行之后)。
  • 未使用的本地变量并未实际分配,甚至未被声明。

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

+0

我不担心优化,我只想知道它们是什么:-) 我想upvote你努力,但有一件事阻止我这样做:“.NET VM”:-) – 2009-06-09 10:44:56