gprof究竟是如何工作的?

Ale*_*lex 14 profiler profiling gprof

这是一个臃肿的问题,所以我提前道歉.我很好奇如何gprof在低技术水平上工作.我理解它是由计时器完成的,但是为什么可执行文件需要专门编译才能被分析?编译是否会导致为统计分配空间?

此外,时间如何完成?

Dr *_*r G 7

嗯,这给出了一个很好的解释.这也解释了统计分析

基本上gprof将更改程序的可执行文件(这称为检测代码)以存储一些簿记信息,例如调用函数的次数.

统计分析位来自于定期监听程序计数器以获取代码正在执行的操作的样本.

Gprof做到了.它检测代码并从查看程序计数器中收集样本.

  • @Alex:它不是它的主要问题之一. (2认同)

Mik*_*vey 7

刚刚阅读了论文(再次),让我试着解释一下.

假设它以100Hz采样,除非因为IO或某些其他原因阻止了进程.每个样本都记录了PC,它具有某种功能.该函数中的样本计数递增.

因此,在运行结束时,如果有(例如)1000个样本,则表示总执行时间(仅CPU)为10秒.如果例程B记录了500个这样的样本,那意味着它的总执行时间是总的1/2或5秒.这是它的自我时间,因为PC在其中.这并不能说明平均执行需要多长时间.要说明这一点,你需要知道它被调用了多少次.它也不包括在被监禁者中度过的时间.

使用-pg标志编译代码时,会在每个例程的入口代码中插入一个特殊调用.这注意到输入了例程B,并且它注意到它是从例程A中的调用站点调用的.有一个表,由该调用站点索引,可以计算该调用.所以最后,gprof可以告诉B总共调用了多少次,其中有多少来自A.

为了得到B的平均自我时间,它的总自我时间除以它被调用的次数.

为了得到例程A的总累积时间(自己加上被调用者),gprof需要A的自身时间加上它调用每个从属例程B的总次数乘以B的平均累积时间.那么这个数字是除以对A的调用总数,得到A的平均累计时间.

听起来不错,直到递归进入图片,在那里它变得更加混乱.

这一切都非常聪明,正如作者所指出的那样,充满了警告.