有没有适用于C语言(gcc)的性能分析器,能够单独对代码行进行分析?

11

我来自Matlab背景,所以我习惯于一款分析器能够对每一行进行剖析,而不仅仅是像gprof或者callgrind那样只剖析每个函数。是否有类似的功能可以用于C的分析器?

谢谢!

screenshot matlab profiler
(来源: jburkardt at people.sc.fsu.edu)


1
SO上已经有许多关于性能分析工具的建议,例如请参见https://dev59.com/f3M_5IYBdhLWcg3w6X1e。 - Paul R
5个回答

12

你可以使用GNU实用程序GCOV进行逐行分析。从GCC文档中获取的示例运行。

$ 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:}

除非我没有正确阅读文档,否则这只告诉您每行执行的次数,而不是执行每行所需的时间。是否有一种方法可以使用GCOV来计算每行的执行时间? - Ben
@Ben 你说得对,gcov 统计了每行代码被执行的次数。 - mikek3332002

4
我相信 callgrind 可以做到这一点。我知道它可以对每行进行循环计数,但我不确定是否包括“时间”方面的统计。

3
鲨鱼是Mac OS X中的一种性能分析工具,可以进行分析(甚至按指令进行分析)。我意识到你的截图是在Windows上,所以可能没有帮助,但也许你可以在Mac上运行你的代码。你可以尝试使用Very Sleepy,但我从未使用过,不知道它有多好。

1
+1 for Shark - 在Linux上最接近的相当工具是Zoom(www.rotateright.com),而在Windows上最好的工具可能是英特尔的VTune(www.intel.com)。 - Paul R
Zoom看起来像我想要的东西,但不幸的是我没有200美元的预算购买分析器。 - Framester

0

点击这个链接并且尝试这个方法

像Mandelbrot这样的例子的问题在于它不是一个非常大的程序。在现实世界的软件中,调用树会变得更加深入和复杂,因此您需要找出每行或指令负责的时间百分比,而这只是它在调用堆栈上所占的时间百分比。因此,您需要一些采样调用堆栈并告诉您每行或指令在其中出现的百分比的工具。您不需要高精度的测量-这是其中一个神话。

有一些工具可以做到这一点,其中之一是RotateRight/Zoom,另一个是LTProf。就我个人而言,我发誓要完全手动地进行。

在过去的几天里,我们在这里的一些代码中遇到了性能问题。通过手动方法,我找到了一种节省40%的方法。然后我又找到了一种在此基础上再节省40%的方法,总共节省了64%。这只是一个例子。这里有一个节省超过97%的例子。 新增:这会有社交影响,可能会限制潜在的加速。假设有三个问题。问题A(在你的代码中)需要一半的时间。问题B(在Jerry的代码中)需要四分之一的时间,问题C(在你的代码中)需要八分之一的时间。当你进行采样时,问题A会跳出来,因为它是你的代码,所以你修复了它,现在程序只需要原来的一半时间。然后你再次采样,问题B(现在是一半)跳出来了。你发现它在Jerry的代码中,所以你必须向Jerry解释,并尽量不让他难堪,问他是否可以修复它。如果由于某种原因他不修复它(比如那是他最喜欢的代码),即使你修复了问题C,时间也只能减少到原来的3/8。如果他修复了它,你可以修复C并将时间降至原来的1/8。然后可能会出现另一个问题D(你的问题),如果你修复它,时间可以降至原来的1/16,但如果Jerry不修复问题B,你无法做得比5/16更好。这就是社交互动在性能调优中绝对至关重要的原因。
我见过的唯一有效的技巧(因为它曾经被用在我身上)是以悲伤、道歉的口吻呈现信息,就像这是你的问题一样,并坚持不懈地呈现信息。道歉的语气能够缓解尴尬,而坚持不懈则让他不断思考。

-1

我们的SD C Profiler工具与GCC源代码配合使用。它提供基本块的分析而不是行级别的分析;这样可以提供完全相同的信息,但开销要小得多。


1
看起来这个答案正在被标记为垃圾邮件。如果那些在这样做的人能说明他们的明确反对意见,那将是有帮助的。如果你们中认为这个答案有用,请留下具体的评论说明它的相关性。 - Ira Baxter
你已经做这种垃圾工作至少6年了? - xaxxon
做什么玩意?我已经建立了40多年的工具。您是指回答需要或请求工具的问题,并使用适当的工具吗?这样似乎并不错。您似乎对任何不免费的东西都很敌对。 - Ira Baxter
@xaxxon:我理解的对吗:你在进行负评是因为回答没有解决提问者的问题,或者回答是错误的? - Ira Baxter
低努力自我宣传垃圾邮件。 - xaxxon
我看到你并没有反对答案的事实性或实用性,只是反对了违背你世界观的部分。你可以有自己的观点,但你不能拥有自己的事实。这种类型的答案在SO上已经被长期制定的政策所接受为有用的。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接