调试与发布性能

我遇到了以下段落:

”在 Visual Studio 中编译代码时,IDE 中的调试与发布设置对性能几乎没有影响... ... 生成的代码几乎是一样的。C # 编译器实际上不做任何优化。C # 编译器只是输出 IL... 在运行时由 JITer 完成所有优化。JITer 确实有一个调试/发布模式,这对性能有很大的影响。但是,这并不关键你是否运行调试或发布配置的项目,这关键是是否有一个调试器附加。”

来源是 给你,播客是 给你

有没有人能告诉我一篇微软的文章可以证明这一点?

在谷歌上搜索“ C # 调试与发布性能”大多会返回“ Debug 有很多性能损失”、“ 释放被优化”和“ 不要将调试部署到生产环境”的结果。

89701 次浏览

我不能评论性能,但是“不要将调试部署到生产环境”的建议仍然有效,因为调试代码在大型产品中通常会做很多不同的事情。一方面,您可能激活了调试开关,另一方面,可能会有额外的冗余健全性检查和不属于生产代码的调试输出。

部分是真的。在调试模式下,编译器为所有变量发出调试符号,并按原样编译代码。在发布模式中,包括一些优化:

  • 未使用的变量根本不进行编译
  • 一些循环变量如果被证明是不变的,编译器就会将它们从循环中删除
  • 不包括在 # debug 指令下编写的代码,等等。

剩下的就看 JIT 的了。

完整的优化列表 给你感谢 Eric Lippert

我不知道站点..。

发布与调试配置

当你还在做你的 项目中,通常会生成 通过使用调试应用程序 配置,因为这个 配置使您能够查看 变量和控制的值 在调试器中执行。您可以 中创建和测试生成 释放配置,以确保 你没有引入任何 只在一种生成类型上显示,或者 另一个。在.NETFramework 中 编程,这样的错误是非常罕见的, 但它们可能发生。

当您准备好分发您的 应用程序到最终用户,创建一个 释放版本,这将是很多 较小的,通常会有很多 更好的表现 相应的调试配置 中设置生成配置 项目设计器的生成窗格,或 在“生成”工具栏中 信息,请参见生成配置。

来自 社交网络

没有很好的记录,这里是什么 我知道,编译器会发出一个 实例 系统。诊断。调试属性。 在调试版本中, 属性为 没错,在发布版本中是这样的 中可以看到此属性 使用 ildasm.exe 的程序集清单

JIT 编译器使用此属性 禁用优化 让调试变得困难 移动代码 循环不变式提升。在选定 情况下,这可以有很大的不同 在表演上,不过通常不是这样。

将断点映射到执行 地址是调试器的工作。 它使用. pdb 文件和信息 由 JIT 编译器生成的 为代码提供 IL 指令 地址映射。如果你写 你自己的调试器,你会使用 ICorDebugCode: : GetILToNativeMapping ().

基本上调试部署会比较慢,因为禁用了 JIT 编译器优化。

你读到的东西很有道理。由于 JIT 优化,发布通常更加精简,不包括调试代码(# IF DEBUG 或[条件(“ DEBUG”)]) ,最小的调试符号加载和通常不被考虑的是较小的程序集,这将减少加载时间。在 VS 中运行代码时,性能差异更为明显,因为加载的 PDB 和符号更为广泛,但如果独立运行,性能差异可能不那么明显。某些代码会比其他代码优化得更好,它正在使用与其他语言相同的优化启发式方法。

Scott 对内联方法优化 给你有很好的解释

请参阅 这篇文章,它简要解释了为什么在 ASP.NET 环境中调试和发布设置不同。

有一点您应该注意,关于性能以及是否附加了调试器,这让我们感到惊讶。

我们有一段代码,涉及许多紧密的循环,似乎要花很长时间来调试,但是它自己运行得很好。换句话说,没有客户或客户在哪里遇到问题,但当我们调试它似乎像糖浆运行。

罪魁祸首是其中一个紧密循环中的 Debug.WriteLine,这个紧密循环产生了数千条日志消息,这些消息是不久前一个调试会话留下的。似乎当调试器被连接并监听这样的输出时,会有一些开销使程序变慢。对于这段特定的代码,它的运行时间为0.2 -0.3秒,附加调试器时为30秒以上。

简单的解决方案,只需删除不再需要的调试消息。

在很大程度上,这取决于您的应用程序是否受计算约束,而且并不总是像 Lasse 的例子那样容易判断。如果我对它在做什么有一点点疑问,我会暂停它几次,然后检查堆栈。如果有什么我不需要的额外的事情发生,马上就会被发现。

没有一篇文章可以“证明”任何关于绩效问题的东西。证明关于更改对性能影响的断言的方法是两种方法都试一试,并在现实但可控的条件下测试它。

你在问一个关于表现的问题,所以很明显你关心表现。如果您关心性能,那么正确的做法是设定一些性能目标,然后为自己编写一个测试套件,用于跟踪这些目标的进展情况。一旦您拥有了这样一个测试套件,您就可以轻松地使用它来测试诸如“调试构建较慢”之类的语句的真假。

此外,你将能够得到有意义的结果。“慢”是没有意义的,因为它不清楚它是慢了一微秒还是慢了二十分钟。“在现实条件下慢10%”更有意义。

把你在网上研究这个问题的时间花在建立一个能够回答这个问题的设备上。这样你会得到更准确的结果。你在网上读到的任何东西都是关于 也许吧发生了什么的 猜猜看。理由来自您自己收集的事实,而不是来自其他人对您的程序可能如何运行的猜测。

我最近遇到了一个性能问题。完整的产品列表花费了太多的时间,大约80秒。我调整了数据库,改进了查询,没有任何区别。我决定创建一个 TestProject,结果发现相同的进程在4秒内执行完毕。然后我意识到项目处于调试模式,而测试项目处于发布模式。我将主项目切换到发布模式,产品完整列表显示所有结果只需要4秒钟。

简介: 调试模式比运行模式慢得多,因为它保留了调试信息。您应该始终在 Relase 模式下进行部署。如果包含。PDB 文件。这样您就可以使用行号记录错误,例如。

调试和发布模式存在差异。有一个工具 Fuzzlyn: 它是一个模糊工具,利用罗斯林生成随机的 c # 程序。它运行这些程序。NET 核心,并确保它们在调试和发布模式下编译时提供相同的结果。

通过这个工具,我们发现并报告了很多错误。