调试C程序中的慢速函数(由gcc构建)

时间:2010-10-20 19:41:29

标签: linux gcc profiling

有这样的来源:

void foo() {
    func1();
    if(qqq) {
        func2();
    };
    func3();
    func4();
    for(...) {
        func5();
    }
}

我想获得这样的信息:

               void foo() {
5  ms; 2 times;    func1();
0  ms; 2 times;    if(qqq) {
0  ms; 0 times;        func2();
0  ms; 2 times;    };
20 ms; 2 times;    func3();
5  s ; 2 times;    func4();
0  ms; 60 times;   for(...) {
30 ms; 60 times;       func5();
0  ms; 60 times;   }
                }

即。有关执行此行所需的平均时间(实际时钟时间,包括在系统调用中等待)以及执行的次数的信息。

我应该使用哪些工具?

我希望该工具能够检测每个函数以测量它的运行时间,该函数由调用函数内部的检测程序使用,该函数写入日志文件(或在内存中计数然后转储)。

3 个答案:

答案 0 :(得分:2)

gprof是GNU构建(gcc,g ++)程序的标准:http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html

以下是输出结果:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC5

答案 1 :(得分:0)

试运行Zoom。你不会失望的。

P.S。不要指望仪器做这项工作。对于行级或功能级信息,挂壁时间堆栈采样器会提供货物,假设您不一定需要精确的调用计数(与性能几乎没有关系)。


ADDED:我在Windows上,所以我只使用LTProf运行您的代码。输出如下:

  void foo(){
 5  func1();
    if(qqq){
 5    func2();
    }
 5  func3();
 5  func4();
    // I made this 16, not 60, so the total time would be 20 sec.
    for(int i = 0; i < 16; i++){
80    func5();
    } 
  }

每个func()执行Sleep(1000)qqq为True,因此整个运行时间为20秒。左边的数字是样本(6,667个样本)上有这一行的百分比。因此,例如,对func函数之一的单次调用使用1秒或5%的总时间。因此,您可以看到调用func5()的行占总时间的80%。 (也就是说,20秒中有16秒。)所有其他线路在堆栈上相对较少,相对而言,它们的百分比为零。

我会以不同的方式呈现信息,但这应该可以让您了解堆栈采样可以告诉您什么。

答案 2 :(得分:0)

Zoom或Intel VTune。