【问题标题】:Setting up a C# application for max performance build设置 C# 应用程序以获得最大性能构建
【发布时间】:2011-08-02 12:11:43
【问题描述】:

所以我们对我们的计划非常满意。它在调试模式下快速而稳定,到目前为止,这是与客户一起使用的版本。我们现在希望从发布版本中获得免费提升。

我现在已经编译了带有代码优化的发布项目:打开。 我有 TRACE 常量:关闭。 高级 -> 输出 -> 调试信息 -> 无。

除了高效的编码实践和系统架构等,调整 C# 应用程序以获得最佳性能的最佳 Visual Studio 设置是什么?

据我所知,JITter 默认在 Release 版本中优化 IL 编译。代码优化 (: On) 涉及编译器以及它如何处理内联等。

是这样还是还有更多?关闭 TRACE 常数是一个错误吗? (如果出现严重问题,我们的应用程序会通过堆栈树向我们发送邮件,我不确定 TRACE 是否与此处相关)

【问题讨论】:

  • No TRACE 不相关。不定义 TRACE 将强制不发出带有“TRACE”的条件属性标记的方法。
  • 虽然 C++ 编译器对其编译的代码进行了大量优化,但 C# 并没有做太多的代码优化。不在调试,也不在发布模式。
  • JITter 应该提供一个很好的提升,尽管发布版本(不像编译器)?

标签: c# .net visual-studio performance


【解决方案1】:

这些是我会为发布构建选择的推荐设置,所有这些设置都可以在项目属性的“构建”选项卡上找到:

  • 取消选中“定义 DEBUG 常量”
  • 取消选中“定义 TRACE 常量”
  • 勾选“优化代码”
  • 在“高级...”对话框下,将“调试信息:”设置为“pdb-only”

可能还希望考虑使用ngen 来加快应用程序的启动时间。此过程必须在最终用户 PC 上完成(通常作为安装过程的一部分),但通常只会在首次运行时提高应用程序性能*。我的建议是,仅当您对应用的冷启动时间有特别担忧时,才考虑使用 ngen。

这些设置的实际作用是什么?

DEBUG 和 TRACE 常量

DEBUGTRACE 常量会影响 conditional directives 中包含的任何代码,例如:(根据需要将 DEBUG 替换为 TRACE)

#if DEBUG
// Anything here will not appear in the end output unless the DEBUG constant is defined
#endif

它还会影响对标有Conditional attribute 的方法的任何调用,例如Debug.WriteTrace.Write

// The following call will not appear in the end output unless the DEBUG constant is defined
Debug.WriteLine("Test");

您可以使用IL Spy 之类的方式自行检查这两项。

请注意,这些常量没有其他影响,例如,如果定义了 DEBUG 常量,JITer 的行为不会有所不同。除非您大量使用条件指令,否则您可能会发现这些对您的应用程序的影响可以忽略不计。

优化代码

这控制编译器 (cs.exe) 和 JIT 编译器在编译代码时执行的优化。由于此设置,您可能会看到大部分性能改进。

以下问题更详细地介绍了此设置的作用:

调试信息

pdb-only 设置告诉编译器将所有调试信息放在单独的 .pdb(程序数据库)文件中。就最终组件而言,这与none 设置完全相同,因为组件不受影响,但是如果您使用pdb-only 设置(超过none 设置),则符号至少在以下情况下可用您希望(如果您不想分发它们,则不必分发它们)。这在调试故障转储时非常有用。

请注意,您不能“返回”并为现有程序集重新生成符号 - 一旦您丢失了程序集的 .pdb(或一开始就选择不创建),这几乎是永远失去!照顾好它(尤其是对于您“向野外”发布的程序集)。

您将在此处看到的唯一真正区别是输出程序集大小 - 这可能会影响加载时间和内存占用,但最终此设置可能不会产生特别明显的影响。


(*) 假设用户在第一次运行应用程序时练习了应用程序的大部分/所有功能 - JITing 过程在调用方法时完成。阅读 JITting / ngen 了解更多详情。

【讨论】:

    【解决方案2】:

    我在几个程序(想到 Paint.NET 和 Adob​​e Acrobat Reader)中看到的一种方法是,它们在安装时在托管程序集上使用ngen。这提供的运行时间提升很小,但启动时间减少了,因为不再需要使用 JIT。

    这可以与您所做的其他优化一起使用。

    (请注意,您不能将ngen 作为构建过程的一部分运行,因为它考虑了当前运行的硬件的具体情况)

    【讨论】:

    • 其实ngen镜像是由.NET Framework为你在后台编译出来的..好处只适用于最初的几家初创公司..
    • @Tigraine - 好吧,我不知道。我想 .NET 将在某处缓存 ngen 的程序集是有道理的。但我没有任何信息。我刚刚注意到有时会这样做。
    【解决方案3】:

    发布和调试之间的性能通常难以察觉。

    大多数 C# 程序将大部分时间花在已经优化的 .net 程序集中。

    【讨论】:

    • 几乎是一个不可能的问题,它因程序而异,但人们可以期望的潜在性能提升是什么? 5%? 20%?
    • 哦,我有一些应用程序在发布模式下运行速度呈指数级增长。完全取决于使用的库编码等。
    • 我说的是大部分,不是全部。
    【解决方案4】:

    我不知道你可以通过 VS 做更多的事情来为你带来足够显着或显着的性能提升。花时间通过分析器运行程序并查看可以微调代码的地方会更好。花一些时间重构一些代码,特别是与 IO、db 相关的代码,并在合适的时候使用并行/线程和缓存可能会给你带来更好的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 2011-01-11
      • 2017-01-30
      • 2013-09-11
      • 1970-01-01
      • 2015-01-29
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多