假设你有这个程序:
main() 调用 A() 调用 B() 调用 C(),C 循环挂起 10 秒。
CPU 分析器会这样说:
total time: 10 sec
routine self% inclusive%
main 0 100
A 0 100
B 0 100
C 100 100
C 的自我时间是 10 秒,100%。其他人的自我时间基本上为零。
他们每个人的总(包括)时间将是 10 秒或 100%。你不用把它们加起来。
另一方面,假设 C 用 10 秒时间进行 I/O。
然后 CPU-only profiler 会这样说:
total time: 0 sec
routine self% inclusive%
main ? ?
A ? ?
B ? ?
C ? ?
因为它使用的唯一实际 CPU 时间非常短,基本上没有样本命中它,所以要获得百分比,它除以零。
OTOH,如果样本在挂钟时间,您将获得第一个输出。
一种更好的分析器是在挂钟时间对调用堆栈进行采样,并告诉您包含时间占总时间的百分比,并在代码行级别将其提供给您,而不仅仅是函数。这很有用,因为它可以直接衡量如果该行执行得更少,可以节省多少,而且几乎没有任何问题可以隐藏。此类分析器的示例是Zoom 和LTProf,我被告知 OProfile 可以做到。 a simple method 适用于任何语言,并且只需要一个调试器。
Here's a discussion of the issues.