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

我来自Matlab背景,所以我习惯了一个分析器,它描述每一行而不仅仅是每个函数,如gprofcallgrindC是否有具有类似function的分析器?

谢谢!

截图matlab profiler

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

您可以使用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  -: 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:} 

我相信callgrind会这样做 。 我知道它确实每行循环计数,但我不确定’时间’。

检查此链接并尝试此方法 。

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

有一些工具可以做到这一点,一个是RotateRight / Zoom ,另一个是LTProf 。 我个人发誓完全手动的方法。

在过去的几天里,我们在这里的一些代码中遇到了性能问题。 通过手动方法,我找到了一种节省40%的方法。 然后我找到了一种节省40%的方法,总节省了64%。 这只是一个例子。 这是一个节省超过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更好。 这就是社交互动在性能调优中绝对至关重要的方式

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

我们的SD C Profiler工具可与GCC源代码配合使用。 它提供基本块而不是行的分析; 这提供了相同的确切信息,并且开销相当低。