我来自Matlab背景,因此我习惯于分析每一行而不仅仅是gprof
或callgrind
等每个函数的分析器。是否有C
具有类似功能的分析器?
谢谢!
答案 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 link和try 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)