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

问题描述 投票:0回答:3

是否有可用的 /optimize C# 编译器密钥完成的优化的完整列表?

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

c# optimization
3个回答
8
投票

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

总结一下: /optimize 做了很多事情,没有给出确切的数字或定义,但最明显的一个是方法内联(如果你有一个方法 A() 调用 B() 调用 C() 调用 D( ),编译器可能会“跳过”B和C,直接从A到D),这可能会导致Release版本中出现“奇怪”的调用堆栈。


2
投票

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

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

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


1
投票

引自MSDN页面

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

换句话说,它的作用正是您所想象的 - 优化由 .NET VM 执行的已编译 CIL(通用中间语言)代码。我不会担心具体的优化是什么 - 只要说它们有很多,并且在某些情况下可能相当复杂。如果您真的对它所做的事情感兴趣,您可能可以研究 Mono C# 编译器(我怀疑有关 MS C# 编译器的详细信息是否公开)。

默认情况下禁用调试配置优化的原因是它使得某些调试功能无法实现。一些值得注意的:

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

确实,永远不应该更改默认的优化选项。关闭调试选项非常有用,而在发布模式下打开该选项同样明智。

© www.soinside.com 2019 - 2024. All rights reserved.