如何在调试器中运行代码使其更快?

时间:2009-11-18 16:10:39

标签: c++ visual-studio visual-c++ performance

它从未发生在我身上。在Visual Studio中,我有一部分代码执行了300次,我每次迭代时使用性能计数器,然后对其进行平均。 如果我在调试器中运行代码,如果我在没有调试器的情况下运行它,我得到的平均值为1.01 ms。我得到1.8 ms。

我关闭了所有其他应用程序,我重新启动,我尝试了很多次:总是在同一时间。

我正在尝试优化我的代码,但在让我改变代码之前,我想确定我的时间。要有比较的东西。

什么可能导致这种奇怪的行为?

修改

一些澄清:

我正在运行相同的编译代码:发布版本。唯一的区别是(F5 vs CTRL-F5) 因此,不应该使用编译器优化。

由于每个计算时间都很小,我改变了我的基准测试方式:我现在计时300次迭代然后除以300.我有相同的结果。

关于缓存:代码正在进行一些图像交叉关联,每次迭代都会有不同的图像。图像中的数据不会修改处理步骤。所以,我认为缓存不是问题所在。

8 个答案:

答案 0 :(得分:3)

我想我已经明白了。

如果我在运行测试之前添加Sleep(3000),它们会给出相同的结果。

我认为这与装载misc有关。 dll文件。在调试器中,在执行任何代码之前加载了dll。在调试器外部,dll是按需加载的,并且在定时器启动后加载了一个或多个。

谢谢大家。

答案 1 :(得分:2)

我认为没有人提到这一点,但调试版本不仅会影响代码的执行方式,还会影响计时器本身的执行方式。这可能导致计时器不准确/慢/绝对不可靠。我建议使用其他人提到的分析器,并仅比较类似的配置。

答案 2 :(得分:1)

通过这种方式你可能会得到非常错误的结果......你应该使用一个分析器。您应该阅读这篇名为 MicroBenchmarking的危险的文章:
http://blogs.msdn.com/shawnhar/archive/2009/07/14/the-perils-of-microbenchmarking.aspx

答案 3 :(得分:0)

这可能是编译器优化,实际上会使您的代码变得更糟。这些日子非常罕见但是如果你做奇怪的事情,可能会发生这种情况。

某些调试器/ IDE(如Visual Studio)将在调试模式下自动为您清零内存;这可能是一个促成因素。

答案 4 :(得分:0)

您是在调试器中以及调试器外部运行完全相同的代码,还是在调试器中运行调试并在外部发布?如果是这样,代码就不一样了。如果您正在运行调试和发布并看到差异,您可以关闭发布中的优化,并在调试和发布中查看它在分析器中执行的操作或运行代码,并查看更改。

答案 5 :(得分:0)

调试版本将变量初始化为0(通常) 虽然发布二进制文件不初始化变量(除非代码明确地做了)。这可能会影响代码执行循环的ziae或其他各种可能性。

将警告级别设置为最高级别(级别4,默认值为3) 设置将警告视为错误的标志。

重新编译并重新测试。

答案 6 :(得分:0)

在深入了解优化会话之前,请先了解一下事实:

  • 剂量有所不同?剂量这个应用程序在合理的时间长度内运行两次缓慢?
  • 如何配置调试和发布版本
  • 这个项目的状态是什么?它是一个完整的软件还是您在分析单个功能?
  • 您如何运行调试和构建版本,是否确定您在相同条件下进行测试(例如,流程优先级设置)

假设你确实优化了代码,你有什么想法?

答案 7 :(得分:0)

读完你的额外数据后,一个遥远的钟声开始响起......

在调试器中运行程序时,它将捕获C ++异常和结构化异常(窗口执行)

一个触发结构化异常的事件是除以零,调试器可能会快速捕获和解除此事件(作为第一次机会异常处理),而发布在做某事之前,代码需要更长时间

因此,如果您的代码可能会生成此类或类似的异常,则需要一段时间来研究它。