我来自Matlab背景,所以我习惯于一款分析器能够对每一行进行剖析,而不仅仅是像gprof
或者callgrind
那样只剖析每个函数。是否有类似的功能可以用于C
的分析器?
谢谢!
我来自Matlab背景,所以我习惯于一款分析器能够对每一行进行剖析,而不仅仅是像gprof
或者callgrind
那样只剖析每个函数。是否有类似的功能可以用于C
的分析器?
谢谢!
你可以使用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:}
像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更好。这就是社交互动在性能调优中绝对至关重要的原因。我们的SD C Profiler工具与GCC源代码配合使用。它提供基本块的分析而不是行级别的分析;这样可以提供完全相同的信息,但开销要小得多。