C(gcc)是否有分析器来分别编码代码行?

时间:2010-07-16 09:37:37

标签: c profiling profiler

我来自Matlab背景,因此我习惯于分析每一行而不仅仅是gprofcallgrind等每个函数的分析器。是否有C具有类似功能的分析器?

谢谢!

screenshot matlab profiler

5 个答案:

答案 0 :(得分:11)

您可以使用GNU实用程序GCOV进行逐行分析。样本从GCC Docs开始。

$ gcc -fprofile-arcs -ftest-coverage tmp.c
$ a.out
$ gcov tmp.c
  90.00% of 10 source lines executed in file tmp.c
  Creating tmp.c.gcov

文件tmp.c.gcov包含如下输出:

     -:    0:Source:tmp.c
     -:    0:Graph:tmp.gcno
     -:    0:Data:tmp.gcda
     -:    0:Runs:1
     -:    0:Programs:1
     -:    1:#include <stdio.h>
     -:    2:
     -:    3:int main (void)
     1:    4:{
     1:    5:  int i, total;
     -:    6:
     1:    7:  total = 0;
     -:    8:
    11:    9:  for (i = 0; i < 10; i++)
    10:   10:    total += i;
     -:   11:
     1:   12:  if (total != 45)
 #####:   13:    printf ("Failure\n");
     -:   14:  else
     1:   15:    printf ("Success\n");
     1:   16:  return 0;
     -:   17:}

答案 1 :(得分:4)

我相信callgrind就是这么做的。我知道它确实每行循环计数,但我不确定'时间'。

答案 2 :(得分:3)

Shark是Mac OS X中的一个分析工具,可以做到这一点(甚至可以通过指令进行分析)。我意识到你的截图是在Windows上,所以可能没什么帮助,但也许你可以在Mac上运行你的代码。您可以尝试Very Sleepy,但我从未使用它,因此不知道它有多好。

答案 3 :(得分:0)

Check this linktry this method

Mandelbrot 这样的例子的问题在于它不是一个非常大的程序。在真实世界的软件中,调用树变得更加深入,更加浓密,所以你需要找出每条线路或指令,它负责的时间百分比,这只是它在通话中的百分比堆。因此,您需要对调用堆栈进行采样的内容,并告诉您,对于每个出现在那里的行或指令,它所使用的样本百分比是多少。你不需要高精度的测量 - 这是一个神话。

有一些工具可以执行此操作,一个是RotateRight/Zoom,另一个是LTProf。我个人发誓完全手动的方法。

在过去的几天里,我们在这里的一些代码中遇到了性能问题。通过手动方法,我找到了一种节省40%的方法。然后我找到了节省40%的方法,总共节省了64%。这只是一个例子。 Here's an example of saving over 97%.

已添加:这可能会限制潜在的加速速度。假设有三个问题。问题A(在您的代码中)需要1/2的时间。问题B(在Jerry的代码中)需要1/4的时间,问题C(在你的代码中)需要1/8的时间。当您进行采样时,问题A会向您跳出,因为它是您的代码,您可以修复它,现在该程序需要原始时间的1/2。然后再次采样,问题B(现在是1/2)跳出来。你看到它是在Jerry的代码中,所以你必须向Jerry解释它,尽量不让他难堪,并问他是否可以解决它。如果他不出于任何原因(就像他最喜欢的代码那样),那么即使你修复问题C,时间也只能减少到原始时间的3/8。如果他确实修复了它,你可以修复C并降低到原始时间的1/8。然后可能有另一个问题D(你的),如果你修复它可以把时间缩短到原始时间的1/16,但如果杰里没有解决问题B你不能做比5/16更好。这就是社交互动在性能调优中绝对关键的方式。

我见过的唯一有效的技术(因为它在我身上使用)是以悲伤,抱歉的语气呈现信息,好像它是你的问题,并坚持不懈提供信息。抱歉的口气消除了尴尬,坚持不懈让他思考它。

答案 4 :(得分:-1)