设置 C# 应用程序以获得最大性能构建
Posted
技术标签:
【中文标题】设置 C# 应用程序以获得最大性能构建【英文标题】:Setting up a C# application for max performance build 【发布时间】:2011-08-02 12:11:43 【问题描述】:所以我们对我们的计划非常满意。它在调试模式下快速而稳定,到目前为止,这是与客户一起使用的版本。我们现在希望从发布版本中获得免费提升。
我现在已经编译了带有代码优化的发布项目:打开。 我有 TRACE 常量:关闭。 高级 -> 输出 -> 调试信息 -> 无。
除了高效的编码实践和系统架构等,调整 C# 应用程序以获得最佳性能的最佳 Visual Studio 设置是什么?
据我所知,JITter 默认在 Release 版本中优化 IL 编译。代码优化 (: On) 涉及编译器以及它如何处理内联等。
是这样还是还有更多?关闭 TRACE 常数是一个错误吗? (如果出现严重问题,我们的应用程序会通过堆栈树向我们发送邮件,我不确定 TRACE 是否与此处相关)
【问题讨论】:
No TRACE 不相关。不定义 TRACE 将强制不发出带有“TRACE”的条件属性标记的方法。 虽然 C++ 编译器对其编译的代码进行了大量优化,但 C# 并没有做太多的代码优化。不在调试,也不在发布模式。 JITter 应该提供一个很好的提升,尽管发布版本(不像编译器)? 【参考方案1】:这些是我会为发布构建选择的推荐设置,所有这些设置都可以在项目属性的“构建”选项卡上找到:
取消选中“定义 DEBUG 常量” 取消选中“定义 TRACE 常量” 勾选“优化代码” 在“高级...”对话框下,将“调试信息:”设置为“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 编译器在编译代码时执行的优化。由于此设置,您可能会看到大部分性能改进。
以下问题更详细地介绍了此设置的作用:
Benefits of 'Optimize code' option in Visual Studio build调试信息
pdb-only
设置告诉编译器将所有调试信息放在单独的 .pdb(程序数据库)文件中。就最终组件而言,这与none
设置完全相同,因为组件不受影响,但是如果您使用pdb-only
设置(超过none
设置),则符号至少在以下情况下可用您希望(如果您不想分发它们,则不必分发它们)。这在调试故障转储时非常有用。
请注意,您不能“返回”并为现有程序集重新生成符号 - 一旦您丢失了程序集的 .pdb(或一开始就选择不创建),这几乎是永远失去!照顾好它(尤其是对于您“向野外”发布的程序集)。
您将在此处看到的唯一真正区别是输出程序集大小 - 这可能会影响加载时间和内存占用,但最终此设置可能不会产生特别明显的影响。
(*) 假设用户在第一次运行应用程序时练习了应用程序的大部分/所有功能 - JITing 过程在调用方法时完成。阅读 JITting / ngen 了解更多详情。
【讨论】:
【参考方案2】:我在几个程序(想到 Paint.NET 和 Adobe Acrobat Reader)中看到的一种方法是,它们在安装时在托管程序集上使用ngen
。这提供的运行时间提升很小,但启动时间减少了,因为不再需要使用 JIT。
这可以与您所做的其他优化一起使用。
(请注意,您不能将ngen
作为构建过程的一部分运行,因为它考虑了当前运行的硬件的具体情况)
【讨论】:
其实ngen镜像是由.NET Framework为你在后台编译出来的..好处只适用于最初的几家初创公司.. @Tigraine - 好吧,我不知道。我想 .NET 将在某处缓存 ngen 的程序集是有道理的。但我没有任何信息。我刚刚注意到有时会这样做。【参考方案3】:发布和调试之间的性能通常难以察觉。
大多数 C# 程序将大部分时间花在已经优化的 .net 程序集中。
【讨论】:
几乎是一个不可能的问题,它因程序而异,但人们可以期望的潜在性能提升是什么? 5%? 20%? 哦,我有一些应用程序在发布模式下运行速度呈指数级增长。完全取决于使用的库编码等。 我说的是大部分,不是全部。【参考方案4】:我不知道你可以通过 VS 做更多的事情来为你带来足够显着或显着的性能提升。花时间通过分析器运行程序并查看可以微调代码的地方会更好。花一些时间重构一些代码,特别是与 IO、db 相关的代码,并在合适的时候使用并行/线程和缓存可能会给你带来更好的结果
【讨论】:
以上是关于设置 C# 应用程序以获得最大性能构建的主要内容,如果未能解决你的问题,请参考以下文章
C#多线程/优化数组迭代以获得有趣的值(最小值、最大值、总和、平均值)