【问题标题】:Why does my program run way faster when I enable profiling?为什么启用分析后我的程序运行得更快?
【发布时间】:2009-12-26 22:57:07
【问题描述】:

我有一个运行速度很慢的程序(即使在发布时也需要 20 秒),所以为了修复它,我尝试使用 Visual Studio 的内置分析器。但是,当我在启用分析的情况下运行程序时,它会在不到一秒的时间内完成。这使得很难找到瓶颈。我会发布代码,但它很长。是否有任何明显或不那么明显的原因导致这种情况发生?

编辑: 好的,所以我将问题缩小到一堆 free() 调用。当我将它们注释掉时,程序运行的时间与启用分析的时间相同。但是现在我有内存泄漏:-/

【问题讨论】:

  • 这可能是某种奇怪形式的海森堡效应 (en.wikipedia.org/wiki/Werner_Heisenberg)。它知道你在寻找,所以它会站起来开始工作。 :-)
  • 我认为它发生的原因与程序中总是在同一点发生的错误相同,除非您在调试器中运行它。

标签: c++


【解决方案1】:

原因是当您在 Visual Studio 中运行应用程序时,调试器会附加到它。当您使用分析器运行它时,调试器未附加。

如果您按 F5 运行程序,即使使用 Release 构建,调试器仍会附加。

如果您尝试自行运行 .exe,或通过 IDE 使用“调试 > 不调试启动”(或仅按 Ctrl+F5)运行程序,应用程序的运行速度应该与使用探查器时一样快。

【讨论】:

  • 谢谢!它确实帮助了我,但在另一种情况下!
  • 完全正确,这应该是公认的答案。
【解决方案2】:

这听起来很像Heisenbug

它们确实会发生,而且发现它们可能会很痛苦。

根据我的经验,你最好的解决方案是改变你的分析方式——可能有几种方法——直到错误消失。

使用不同的分析器。尝试添加计时代码而不是使用分析器。

【讨论】:

    【解决方案3】:

    打开分析器最终会(一点)移动您的代码,这可能会掩盖问题。

    hiesenbugs 最常见的原因是未初始化的变量,第二个最常见的原因是在 freed() 之后使用内存。由于您的 free 似乎可以修复它,您可能会考虑查找后期引用,但如果我是您,我仍然会首先查找未初始化的变量。

    【讨论】:

      【解决方案4】:

      在我的情况下,这是由于 Windows 计时器分辨率。

      如果您的程序使用线程,则系统范围的计时器分辨率可能是在 Visual Studio 中运行时间较长的原因。

      默认的windows定时器分辨率是15.6ms

      通过分析器运行时,分析器将此值设置为 1 毫秒,从而加快执行速度。看看这个answer

      【讨论】:

        【解决方案5】:

        一般的方法是分而治之,即只运行程序的一部分,看看问题何时消失。但听起来好像你已经这样做了。 AFAIK free 通常不会花费太多时间,但如果内存碎片化,malloc 可能会花费很多时间。如果你不调用 free(),堆从一开始就不会碎片化。 (侵入式分析代码可能会通过分配小数据块并填充空闲间隙来防止内存碎片 - 但我承认这是一个有点弱的解释)。

        也许您可以在调用 malloc 和 new 之前/之后添加手动时间测量调用并打印出时间来验证这一点?也许您还可以分析您的内存分配模式以找出您是否有堆碎片问题(可能通过查看代码并在脑海中进行一些符号调试;-)

        【讨论】:

          【解决方案6】:

          使用非侵入式样本分析器而不是侵入式检测分析器。

          【讨论】:

            【解决方案7】:

            这可能是由于编译器在分析模式下运行时没有执行一些优化。所以,我建议你检查正在传递的参数并检查编译器文档。

            【讨论】:

              猜你喜欢
              • 2016-08-05
              • 2016-07-26
              • 2012-09-22
              • 2012-09-13
              • 1970-01-01
              • 1970-01-01
              • 2012-08-12
              • 2019-01-31
              • 2017-03-19
              相关资源
              最近更新 更多