Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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
在调试模式和发布模式下生成的.NET程序集之间的性能差异?_.net - Fatal编程技术网

在调试模式和发布模式下生成的.NET程序集之间的性能差异?

在调试模式和发布模式下生成的.NET程序集之间的性能差异?,.net,.net,以前的一些开发人员将一些在调试模式下构建的程序集投入生产。是否值得在发布模式下重新编译并重新部署它们?如果只有1-2%的性能提升,我可能会把它们留在那里。另一方面,10-20%的增长可能会改变我的想法。根据我的经验,我看到了30-40%的差异。这是一个用于加密、压缩和少量文件i/o的库。超过85%的时间用于加密和压缩,只是移动字节 另一个反对在生产环境中使用调试版本的理由是,由于需要加载调试符号,因此它们会消耗更多内存。通常,您会看到一个好处,因为发布版本通常使用/optimize编译器选项进行

以前的一些开发人员将一些在调试模式下构建的程序集投入生产。是否值得在发布模式下重新编译并重新部署它们?如果只有1-2%的性能提升,我可能会把它们留在那里。另一方面,10-20%的增长可能会改变我的想法。

根据我的经验,我看到了30-40%的差异。这是一个用于加密、压缩和少量文件i/o的库。超过85%的时间用于加密和压缩,只是移动字节

另一个反对在生产环境中使用调试版本的理由是,由于需要加载调试符号,因此它们会消耗更多内存。

通常,您会看到一个好处,因为发布版本通常使用
/optimize
编译器选项进行优化编译。然而,差异有多大将取决于您的具体装配-您需要对其进行分析。

大约一年前,我有过同样的问题,因为我们在生产中遇到了重大性能问题。正如MS Premier support向我解释的那样,调试构建版本包括用于调试的挂钩,这可能导致内存消耗增加约1-10%,具体取决于应用程序的功能


如果您没有问题,请不要管它们,但是如果您在内存消耗方面有问题,请继续重新编译/部署。

我发现性能差异会随着代码的复杂性呈指数级增加-一个简单的应用程序可能只会看到5%的差异,但我已经看到复杂应用程序的速度降低了50%,特别是那些涉及更大数据结构(如阵列或地图)的应用程序


当然,调试代码也可能略有不同,这取决于您的设置方式——例如,查看断言。

值得注意的是,发布代码还删除了一些预处理器内容,如:

#if DEBUG
...
#endif

它还删除了Debug.WriteLine、Debug.Assert以及System.Diagnostics命名空间中的一些其他内容,这些内容在测试中可能很有用,但在发布版本的精心设计的代码中是毫无意义的。

如果您查看为调试和发布版本生成的IL代码,差异通常非常小。大多数不同之处在于关键源代码点上的附加nop命令,以支持“编辑并继续”和源代码行调试。但是,当.NET运行时实际JIT MSIL时,运行时程序集几乎相同。最大的区别在于附加了调试器。这将阻止JIT优化实际运行的代码

发布版本通常也要小得多,因为它们没有包含那么多的代码。可能有一些代码补丁被#if调试语句以及条件属性包围,这些属性指示编译器在发布模式(如DEBUG.WriteLine)中忽略对方法的调用

我发现Debug.WriteLine和Trace.WriteLine方法,如果留在生产代码中,即使没有附加调试器,也会对性能产生重大影响