我需要分析一个程序,看看是否需要对性能进行任何更改.我怀疑有需要,但先测量是要走的路.这不是那个程序,但它说明了我遇到的问题:
#includeint main (int argc, char** argv) { FILE* fp = fopen ("trivial.c", "r"); if (fp) { char line[80]; while (fgets (line, 80, fp)) printf (line); fclose (fp); } return 0; }
这是我用它做的:
% gcc trivial.c -pg -o trivial % ./trivial ... % gprof trivial gmon.out
当然,这是一个微不足道的计划,但我认为它会在分析雷达上产生某种昙花一现.它没有:
called/total parents index %time self descendents called+self name index called/total children 0.00 0.00 1/1 __start [1704] [105] 0.0 0.00 0.00 1 _main [105] ----------------------------------------------- % cumulative self self total time seconds seconds calls ms/call ms/call name 0.0 0.00 0.00 1 0.00 0.00 _main [105] Index by function name [105] _main
谁能指导我在这里?我希望输出反映它至少调用14次fgets和printf,并且它确实击中了磁盘 - 肯定会有一些测量时间.
当我在真实程序上运行相同的命令时,我会列出更多的功能,但即使这样,它也不是一个完整的列表 - 只是一个示例.
也许gprof不是正确的工具.什么是?
这是在OS X Leopard上.
编辑:我运行了真正的程序,得到了这个:
% time real_program real 4m24.107s user 2m34.630s sys 0m38.716s
Anonymous.. 5
我认为您可以尝试各种Valgrind工具,尤其是callgrind
(用于为您的程序中发生的每次通话获取通话计数和包含成本).
valgrind输出有各种不错的可视化工具.我不知道OS X的特定工具.
我认为您可以尝试各种Valgrind工具,尤其是callgrind
(用于为您的程序中发生的每次通话获取通话计数和包含成本).
valgrind输出有各种不错的可视化工具.我不知道OS X的特定工具.
默认情况下gprof
显示有限的数据.这很好.看看你的输出 - 它只提到main(这是默认值).现在,看一下calls
专栏 - 这就是你想要的.但是对于其他功能,请尝试:
gprof -e main -f printf -f fgets trivial > gprof.output
这是一些命令的链接.另外,试试man gprof
你的系统.以下是解释数据的方法.
另外,查看ltrace
,strace
并且ptrace
(如果可用 - 我不再回想起所有这些都在OSX上) - 它们很有趣!