所以我们对我们的计划非常满意。它在 Debug模式下快速稳定,到目前为止,这是与客户一起使用的版本。我们现在希望从发布版本中获得免费的提升。
我现在已经编译了代码优化发布的项目:开。 我有 TRACE 常量:关闭。 高级 -> 输出 -> 调试信息 -> 无。
除了高效的编码实践和系统架构等,调整 C# 应用程序以获得最佳性能的最佳 Visual Studio 设置是什么?
据我所知,JITter 在发布版本中默认优化 IL 编译。代码优化 (: On) 涉及编译器及其如何处理内联等。
是这样还是还有更多?关闭 TRACE 常量是一个错误吗? (如果出现严重错误,我们的应用程序会向我们发送堆栈树,我不确定这里是否与 TRACE 相关)
最佳答案
这些是我会为发布构建选择的推荐设置,所有这些设置都可以在项目属性的“构建”选项卡上找到:
- 取消选中“定义调试常量”
- 取消选中“定义 TRACE 常量”
- 检查“优化代码”
- 在“Advanced...”对话框下,将“Debug Info:”设置为“pdb-only”
您可能也希望考虑使用 ngen加快应用程序启动时间。此过程必须在最终用户 PC 上完成(通常作为安装过程的一部分),但通常只会提高应用程序首次运行时的性能*。我的建议是,仅当您特别担心应用的冷启动时间时才考虑使用 ngen。
这些设置的实际作用是什么?
DEBUG 和 TRACE 常量
DEBUG
和TRACE
常量会影响 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.Write
和Trace.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/