gprof究竟是如何工作的?

时间:2011-02-12 22:46:52

标签: profiling profiler gprof

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

此外,时间如何完成?

2 个答案:

答案 0 :(得分:7)

好吧,这给了good explanation。这也解释了statistical profiling

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

统计分析位来自定期窥探程序计数器以获取代码正在执行的示例。

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

答案 1 :(得分:7)

刚刚再次read the paper,让我试着解释一下。

假设它以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的平均累积时间。

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

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