当前位置:  开发笔记 > 编程语言 > 正文

我怎样才能获得更好的分析?

如何解决《我怎样才能获得更好的分析?》经验,为你挑选了2个好方法。

我需要分析一个程序,看看是否需要对性能进行任何更改.我怀疑有需要,但先测量是要走的路.这不是那个程序,但它说明了我遇到的问题:

#include 
int 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的特定工具.



1> Anonymous..:

我认为您可以尝试各种Valgrind工具,尤其是callgrind(用于为您的程序中发生的每次通话获取通话计数和包含成本).

valgrind输出有各种不错的可视化工具.我不知道OS X的特定工具.



2> dirkgently..:

默认情况下gprof显示有限的数据.这很好.看看你的输出 - 它只提到main(这是默认值).现在,看一下calls专栏 - 这就是你想要的.但是对于其他功能,请尝试:

gprof -e main -f printf -f fgets trivial > gprof.output

这是一些命令的链接.另外,试试man gprof你的系统.以下是解释数据的方法.

另外,查看ltrace,strace并且ptrace(如果可用 - 我不再回想起所有这些都在OSX上) - 它们很有趣!

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有