是否有一个用于C(gcc)单独评测代码行的分析器?

是否有一个用于C(gcc)单独评测代码行的分析器?,c,profiling,profiler,C,Profiling,Profiler,我来自Matlab背景,所以我习惯了一个剖析器,它剖析每一行,而不仅仅是像gprof或callgrind这样的每一个函数。是否有具有类似功能的C探查器 谢谢 (来源:)我相信是这样的。我知道它每行都有循环计数,但我不确定“时间”是多少。Mac OS X中的评测工具之一Shark可以做到这一点(甚至可以按指令评测)。我意识到你的屏幕截图是在Windows上的,所以可能没有帮助,但也许你可以在Mac上运行你的代码。您可以尝试,但我从未使用过它,所以我不知道它有多好。您可以使用GNU实用程序进行逐行

我来自Matlab背景,所以我习惯了一个剖析器,它剖析每一行,而不仅仅是像
gprof
callgrind
这样的每一个函数。是否有具有类似功能的
C
探查器

谢谢



(来源:)

我相信是这样的。我知道它每行都有循环计数,但我不确定“时间”是多少。

Mac OS X中的评测工具之一Shark可以做到这一点(甚至可以按指令评测)。我意识到你的屏幕截图是在Windows上的,所以可能没有帮助,但也许你可以在Mac上运行你的代码。您可以尝试,但我从未使用过它,所以我不知道它有多好。

您可以使用GNU实用程序进行逐行分析。样本运行从

文件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:}
-:0:来源:tmp.c
-:0:图形:tmp.gcno
-:0:数据:tmp.gcda
-:0:运行次数:1
-:0:程序:1
-:1:#包括
-:    2:
-:3:int main(无效)
1:    4:{
1:5:int i,总计;
-:    6:
1:7:total=0;
-:    8:
11:9:for(i=0;i<10;i++)
10:10:total+=i;
-:   11:
1:12:if(总计!=45)
#####:13:printf(“失败”);
-:14:其他
1:15:printf(“成功”);
1:16:返回0;
-:   17:}

像曼德尔布罗特这样的例子的问题在于它不是一个很大的项目。在真实的软件中,调用树变得更加深入和繁杂,因此您需要找出每行或每条指令,它负责的时间百分比,这只是它在调用堆栈上的时间百分比。因此,您需要对调用堆栈进行采样,并告诉您,对于出现在那里的每一行或每一条指令,它的采样百分比是多少。你不需要高精度的测量——这是一个神话

有一些工具可以做到这一点,一个是,另一个是。就我个人而言,我对完全手工的方法发誓

在过去的几天里,我们在一些代码中遇到了性能问题。通过手动方法,我找到了一种节省40%的方法。然后我找到了一种方法,在这个基础上节省了40%,总共节省了64%。这只是一个例子

补充道:这会产生社会影响,从而限制潜在的加速。假设有三个问题。问题A(在代码中)占用了1/2的时间。问题B(在Jerry的代码中)需要1/4的时间,问题C(在您的代码中)需要1/8的时间。当你采样时,问题A会跳到你身上,因为它是你的代码,你会修正它,现在程序只需要原始时间的1/2。然后你再次取样,问题B(现在是1/2)就跳出来了。你看,这是在杰瑞的代码,所以你必须解释给杰瑞,尽量不让他尴尬,并问他是否可以修复它。如果他出于任何原因不这样做(比如那是他最喜欢的代码),那么即使你修复了问题C,时间也只能减少到原来时间的3/8。如果他真的修好了,你就可以修好C,把时间缩短到原来的1/8。然后可能还有另一个问题D(你的),如果你解决了它,时间可以降到原来时间的1/16,但是如果Jerry不解决问题B,你就不能比5/16做得更好。这就是为什么社交互动在性能调整中是绝对关键的


我所见过的唯一有效的方法(因为它是用在我身上的)是用悲伤、道歉的语气来表达信息,就好像这是你的问题一样,并坚持不懈地表达信息。道歉的语气消除了尴尬,而这种坚持让他一直在思考这个问题。

我们的工具与GCC源代码一起工作。它提供基本块而不是线的分析;这将以相当低的开销提供相同的准确信息。

+1对于Shark,Linux上最接近的等价物是Zoom(www.rotateright.com),我认为在Windows上最好使用Intel的VTune(www.Intel.com)。Zoom看起来像我想要的东西,但不幸的是,我没有200美元档案器的预算。许多关于档案工具等的建议已经存在,请参阅,例如,似乎这个答案正在被垃圾邮件标记。如果那些正在这样做的人明确表示反对,那将是有益的。如果你们中那些认为这个答案有用的人留下一个具体的评论,说明为什么它是相关的,这会很有帮助。你已经做这个垃圾至少6年了?做什么垃圾?我已经制作工具40多年了。你是说用合适的工具回答需要或需要工具的问题?不知何故,这似乎没有错。你似乎对任何不免费的东西都怀有敌意。@xaxxon:我有这个权利吗:你投反对票是因为答案没有回答OP的问题,和/或答案是错误的?低强度的自我广告垃圾邮件。除非我没有正确阅读文档,否则这只会告诉你每行执行了多少次,不是执行每一行需要多少时间。有没有办法用GCOV计算每行的执行时间?@Ben你说得对,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:}