c# - 为最高性能build设置 C# 应用程序

标签 c# .net visual-studio performance

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

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

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

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

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

最佳答案

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

  • 取消选中“定义调试常量”
  • 取消选中“定义 TRACE 常量”
  • 检查“优化代码”
  • 在“Advanced...”对话框下,将“Debug Info:”设置为“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 的更多详细信息。

关于c# - 为最高性能build设置 C# 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6911863/

相关文章:

c# - 锚定 - 使两个组件各占面板的一半

c# - 如何在母版页中只加载一次菜单?

c# - 如何在 Visual Studio 中构建版本到版本子文件夹

.net - 如何在 Visual Studio 2019 上解锁 NLog.config

c# - WPF - Prism 7.1 - 导航 - 掌握选项卡控件 - 模态/对话框窗口

c# - 在 HttpClientHandler 可移植类库 (PCL) 中设置代理时找不到方法

c# - 使用 Skype4ComLib 时出错

.net - 如何使用现有帐户从程序_without_发送电子邮件?

visual-studio - Visual Studio 2012 中无法启动配置 Visual Studio 开发 Web 服务器错误

c# - 将 Func<Type, object> 表达式转换为 Func<T>,其中 T 是泛型约束