有这样的来源:
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; }
}
即。有关执行此行所需的平均时间(实际时钟时间,包括在系统调用中等待)以及执行的次数的信息。
我应该使用哪些工具?
我希望该工具能够检测每个函数以测量它的运行时间,该函数由调用函数内部的检测程序使用,该函数写入日志文件(或在内存中计数然后转储)。
答案 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。