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

时间:2011-08-02 12:11:43

标签: c# .net visual-studio performance

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

我现在已经使用代码优化编译了Release版本:On。 我有TRACE常数:关闭。 高级 - >输出 - >调试信息 - >无。

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

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

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

4 个答案:

答案 0 :(得分:27)

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

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

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

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

DEBUG和TRACE常量

DEBUGTRACE常量影响conditional directives中包含的任何代码,例如:(根据需要替换DEBUG for 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了解更多详情。

答案 1 :(得分:1)

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

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

(请注意,您无法在构建过程中运行ngen,因为它会考虑当前正在运行的硬件的细节)

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

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