16

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

另外,时间是如何精确完成的?

4

2 回答 2

10

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

假设它以 100Hz 的频率进行采样,除非进程因 IO 或其他原因而被阻塞。每个样本都记录了PC,它在某些功能中。该函数中的样本计数增加。

因此,在运行结束时,如果有(例如)1000 个样本,则意味着总执行时间(仅 CPU)为 10 秒。如果例程 B 记录了 500 个这些样本,这意味着它的总执行时间是总数的 1/2,即 5 秒。这是它自己的时间,因为 PC 就在其中。这并不能说明执行平均需要多长时间。要说明这一点,您需要知道它被调用了多少次。它也不包括在被调用者中花费的时间。

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

要得到B的平均self time,它的总self time除以它被调用的次数。

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

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

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

于 2011-02-18T20:11:07.780 回答
9

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

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

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

Gprof 两者都做。它检测代码并通过查看程序计数器收集样本。

于 2011-02-12T23:03:22.860 回答