设置C#应用程序以实现最高性能构建

Wol*_*lan 26 .net c# performance visual-studio

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

我现在已经编译了Release with Code Optimization:On.我有TRACE常数:关闭.高级 - >输出 - >调试信息 - >无.

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

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

那是它还是更多?将TRACE变为常量错误吗?(我们的应用程序用堆栈树邮寄给我们,如果出现严重问题,我不确定TRACE是否与此相关)

Jus*_*tin 28

这些是我为发布版本选择的推荐设置,所有这些设置都可以在项目属性的"Build"选项卡中找到:

  • 取消选中 "定义DEBUG常量"
  • 取消选中 "定义TRACE常量"
  • 检查 "Opimize code"
  • 在"高级..."对话框下将"调试信息:"设置为"仅限pdb"

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

这些设置实际上做了什么?

DEBUG和TRACE常量

DEBUGTRACE常量影响封闭在任何代码的条件指令,例如:(替代DEBUG为TRACE根据需要)

#if DEBUG
// Anything here will not appear in the end output unless the DEBUG constant is defined
#endif
Run Code Online (Sandbox Code Playgroud)

它还会影响对标记为Conditional属性的方法的任何调用,例如:Debug.WriteTrace.Write:

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

您可以使用IL Spy之类的东西自己检查这两个.

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

优化代码

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

以下问题涵盖了此设置更详细的内容:

调试信息

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

请注意,您不能"返回"并为现有程序集重新生成符号 - 一旦您丢失了.pdb的程序集(或者选择不首先创建一个程序集),它就会永远丢失!注意它(特别是对于你"释放到野外"的组件).

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


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