关于Linux:查找C++函数运行所需的时间

Find time it takes for a C++ function to run

本问题已经有最佳答案,请猛点这里访问。

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


有另一种方法可以找到问题,而不是得到一个功能时间的分解。

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

假设你有一个速度问题,当固定的时候,可以节省一些时间,比如30%。这意味着您检查的每个堆栈样本在问题期间至少有30%的可能性发生。所以,把它转过来,如果你看到它在做一些可以消除的事情,并且你在多个样本上看到它,你就发现了你的问题!(或至少其中一个)**

这就是随机暂停技术。它会发现计时器会遇到的任何问题,以及他们不会遇到的问题。

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


1
2
3
4
5
6
7
8
9
10
11
#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;
}


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