为什么在启用分析时我的程序运行得更快?

时间:2009-12-26 22:57:07

标签: c++

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

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

7 个答案:

答案 0 :(得分:24)

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

如果按F5运行程序,即使使用Release版本,调试器仍然会附加。

如果您尝试单独运行.exe,或者通过IDE运行程序并使用“Debug> Start Without Debugging”(或者只按Ctrl + F5),应用程序的运行速度应与分析器的运行速度一样快。

答案 1 :(得分:10)

这听起来很像Heisenbug

他们真的发生了,发现他们会很痛苦。

根据我的经验,您的最佳解决方案是更改您的分析方式 - 可能有多种方式 - 直到错误消失。

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

答案 2 :(得分:5)

打开探查器会最终移动代码(可能会掩盖问题)。

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

答案 3 :(得分:1)

在我看来,这是由于Windows计时器分辨率所致。

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

默认的Windows计时器分辨率为15.6ms

通过探查器运行时,探查器将此值设置为1ms,从而可以更快地执行。检出此answer

答案 4 :(得分:0)

一般的方法是分而治之,即只运行部分程序,看看问题什么时候消失。但听起来好像你已经这样做了。 AFAIK免费通常不会花费太多时间,但如果内存碎片化,malloc可能会花费大量时间。如果你不调用free(),那么堆首先就不会碎片化。 (侵入性分析代码可能通过分配小数据块并填补空闲空白来防止内存碎片 - 但我承认这是一个微弱的解释)。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这可能是由于编译器在分析模式下运行时很少执行优化。因此,我建议您检查传递的参数并检查编译器文档。