Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置C#应用程序以实现最高性能构建_C#_.net_Visual Studio_Performance - Fatal编程技术网

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

设置C#应用程序以实现最高性能构建,c#,.net,visual-studio,performance,C#,.net,Visual Studio,Performance,所以我们对我们的节目很满意。它在调试模式下快速稳定,到目前为止,这是客户的实时版本。我们现在渴望从发布版本中得到免费的提升 我现在已经编译了这个项目,并使用代码优化:On发布。 我有跟踪常数:关。 高级->输出->调试信息->无 除了高效的编码实践和系统架构等,调整C#应用程序以获得最高性能的最佳Visual Studio设置是什么 据我所知,抖动在发布版本中默认优化了IL编译。代码优化(:On)涉及编译器以及它如何处理内联等 是这样还是更多?关闭跟踪常数是错误的吗?(如果出现严重问题,我们的应

所以我们对我们的节目很满意。它在调试模式下快速稳定,到目前为止,这是客户的实时版本。我们现在渴望从发布版本中得到免费的提升

我现在已经编译了这个项目,并使用代码优化:On发布。 我有跟踪常数:关。 高级->输出->调试信息->无

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

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


是这样还是更多?关闭跟踪常数是错误的吗?(如果出现严重问题,我们的应用程序会向我们发送堆栈树邮件,我不确定跟踪是否与此相关)

发布和调试之间的性能通常不明显


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

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

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


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

我不知道,通过VS,您还可以做更多的事情,这将给您带来足够显著或显著的性能提升。您最好花点时间通过分析器运行程序,看看哪里可以微调代码。花一点时间重构一些代码,特别是与IO、db相关的代码,并在适当时使用并行/线程和缓存,可能会获得更好的结果

这些是我为发布版本选择的建议设置,所有这些设置都可以在项目属性的“构建”选项卡上找到:

  • 取消选中“定义调试常量”
  • 取消选中“定义跟踪常数”
  • 检查“优化代码”
  • 在“高级…”对话框下,将“调试信息:”设置为“仅pdb”
<>您可能还希望考虑使用以加快应用程序启动时间。此过程必须在最终用户PC上完成(通常作为安装过程的一部分),但通常只会在第一次运行时提高应用程序性能*。我的建议是,如果您对应用程序的冷启动时间有特殊的关注,请考虑使用NGEN。

这些设置实际上是做什么的? 调试和跟踪常量
DEBUG
TRACE
常量会影响包含在中的任何代码,例如:(根据需要用DEBUG替换TRACE)

它还影响对标记为的方法的任何调用,例如
Debug.Write
Trace.Write

// The following call will not appear in the end output unless the DEBUG constant is defined
Debug.WriteLine("Test");
您可以使用类似的方法自己检查这两个

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

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

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

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

请注意,您不能“返回”并为现有程序集重新生成符号-一旦您丢失了程序集的.pdb(或选择不首先创建一个),它将永远丢失!注意它(特别是对于您“发布到野外”的程序集)

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



(*)假设用户在第一次运行应用程序时使用了应用程序的大部分/所有功能—JIT过程在调用方法时完成。阅读JITting/ngen了解更多详细信息。

没有不相关的跟踪。不定义跟踪将强制用带有“跟踪”的条件属性标记的方法不被释放。尽管C++编译器对编译的代码进行了优化优化,但是C没有做很多代码优化。不在调试模式下,也不在发布模式下。虽然发布版本(与编译器不同)中的抖动应该会提供良好的提升?这几乎是一个不可能的问题,而且程序之间的差异很大,但人们希望的潜在性能提升是什么?5%? 20%?哦,我有一些应用程序在发布模式下运行速度会成倍提高。完全取决于使用的库编码等。我说的是大部分,不是全部。实际上,ngen图像是由.NET Framework在后台为您编译的。。这一好处只适用于最初的几家初创公司。@Tigraine-嗯,我不知道这一点。我想是吧
// The following call will not appear in the end output unless the DEBUG constant is defined
Debug.WriteLine("Test");