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

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

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

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

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

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

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

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

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

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

DEBUG和TRACE常量

DEBUGTRACE常量会影响条件指令中包含的任何代码,例如:(根据需要替换DEBUG for TRACE)

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

它还会影响对标记为Conditional属性的方法的任何调用,例如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编译器在编译代码时执行的优化。 由于此设置,您可能会看到大部分性能改进。

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

  • Visual Studio构建中“优化代码”选项的优点

调试信息

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

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

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


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

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

这可以与您执行的其他优化一起使用。

(请注意,您不能将ngen作为构建过程的一部分运行,因为它会考虑当前运行的硬件的细节)

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

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

我没有更多你可以通过VS做到这一点,这将给你足够的或显着的性能增益。 您最好花时间通过分析器运行程序,并查看可以对代码进行微调的位置。 花一点时间重构一些代码,特别是与IO,db和使用并行/线程和缓存相关的代码可能会让你获得更好的结果