【问题标题】:Find time it takes for a C++ function to run [duplicate]查找 C++ 函数运行所需的时间 [重复]
【发布时间】:2015-10-13 20:33:50
【问题描述】:

我正在调试一个大型 C++ 项目(Linux 环境),运行一个二进制文件所需的时间似乎比我预期的要多。如何查看每个源文件中每个函数调用所花费的时间细目,以便找到问题?

【问题讨论】:

标签: c++ linux performance runtime


【解决方案1】:

除了获得功能时间细分之外,还有另一种方法可以找到问题。

在调试器下运行,手动中断几次,每次检查调用堆栈。 如果您查看代码中调用堆栈的每一层,您就可以确切地了解为什么要花费那个时间。

假设您有一个速度问题,修复后将节省一小部分时间,例如 30%。 这意味着您检查的每个堆栈样本在问题期间至少有 30% 的机会发生。 所以,把它转过来,如果你看到它做了一些可以被淘汰的事情,并且你在多个样本上看到它,你就发现了你的问题! (或至少其中之一)**

那是the random-pausing technique。 它会发现计时器会发现的任何问题,以及它们不会发现的问题。

** 您可能需要考虑一下。如果您看到它在单个样本上做某事,那并没有多大意义。 即使代码只做一千种完全不同的事情,它们都不会花费大量时间,它也必须在某个地方停下来。 但是如果你看到它在做某事,而且你在不止一个样本上看到它,而且你没有采集很多样本,那么你两次击中同一个无关紧要的东西的概率是非常非常小的。 因此,它的概率更可能是显着的。 事实上,对其概率的合理猜测是您看到它的样本数除以样本总数。

【讨论】:

  • 这是个好建议。但可能不是获得函数计时的答案。
  • @Satish:这种情况经常发生。他想“找到问题”,他认为时机就是解决问题的方法。这是XY problem.
  • 我之前在其他问题中给出的建议就像你在这里给出的建议时被钉死在十字架上。现在小心点……
  • @Satish:听说过“看那只乌龟。他只有伸出脖子才能进步。”?克服根深蒂固的误解并不容易,但如果你能证明你是对的,那么你就是在服务。
【解决方案2】:
#include <iostream> 
#include <ctime>

int main() {
    std::clock_t start = std::clock();

    //code here

    double duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
    std::cout << duration << std::endl;
}

【讨论】:

    【解决方案3】:

    您可以创建自己的计时器类。在每个块调用方法开始时将计时器变量重置为零 并在代码块末尾获取计时器。你可以这样做 在代码的各个块中。一旦你确定了代码块 需要更多时间,你也可以有内部计时器。如果你想尝试一个比我推荐使用 gprof 的标准工具。 http://www.thegeekstuff.com/2012/08/gprof-tutorial/

    【讨论】:

    • gprof 很受人尊敬,但它被要求做一些它从未承诺过且不擅长的事情,比如寻找加速。 Look here.
    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 2021-12-23
    • 2015-06-26
    • 2017-04-17
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多