设置 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 常量

DEBUGTRACE 常量会影响 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.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 编译器在编译代码时执行的优化。由于此设置,您可能会看到大部分性能改进。

以下问题更详细地介绍了此设置的作用:

Benefits of 'Optimize code' option in Visual Studio build

调试信息

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

请注意,您不能“返回”并为现有程序集重新生成符号 - 一旦您丢失了程序集的 .pdb(或一开始就选择不创建),这几乎是永远失去!照顾好它(尤其是对于您“向野外”发布的程序集)。

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


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

【讨论】:

【参考方案2】:

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

这可以与您所做的其他优化一起使用。

(请注意,您不能将ngen 作为构建过程的一部分运行,因为它考虑了当前运行的硬件的具体情况)

【讨论】:

其实ngen镜像是由.NET Framework为你在后台编译出来的..好处只适用于最初的几家初创公司.. @Tigraine - 好吧,我不知道。我想 .NET 将在某处缓存 ngen 的程序集是有道理的。但我没有任何信息。我刚刚注意到有时会这样做。【参考方案3】:

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

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

【讨论】:

几乎是一个不可能的问题,它因程序而异,但人们可以期望的潜在性能提升是什么? 5%? 20%? 哦,我有一些应用程序在发布模式下运行速度呈指数级增长。完全取决于使用的库编码等。 我说的是大部分,不是全部。【参考方案4】:

我不知道你可以通过 VS 做更多的事情来为你带来足够显着或显着的性能提升。花时间通过分析器运行程序并查看可以微调代码的地方会更好。花一些时间重构一些代码,特别是与 IO、db 相关的代码,并在合适的时候使用并行/线程和缓存可能会给你带来更好的结果

【讨论】:

以上是关于设置 C# 应用程序以获得最大性能构建的主要内容,如果未能解决你的问题,请参考以下文章

C# 数组或 List(T) 以获得最佳性能

XCode 构建设置以提高性能 - iPhone 应用程序

C#多线程/优化数组迭代以获得有趣的值(最小值、最大值、总和、平均值)

如何使用 c# 在窗口应用程序中使用快捷键最小化窗口以最大化窗口?

使用 C# 进行消息传递的用途

C# WPF 如何以编程方式设置控件的位置、宽度和高度?