什么是'自我'和'总'列? 'total'列的总和不高达100%(高得多),看起来像是自我。我怀疑自我是非累积的,总是。因此,如果methodA调用methodB调用methodC,则在self Id中单独看每个方法调用的%,而总方法A将显示所有三个方法的总和,methodB将显示2,依此类推。
这是对的吗?
答案 0 :(得分:3)
假设你有这个程序:
main()调用A()调用B()调用C(),C挂起循环10秒。 CPU-profiler会说这样的话:
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的分析器会说这样的话:
total time: 0 sec
routine self% inclusive%
main ? ?
A ? ?
B ? ?
C ? ?
因为它使用的唯一实际CPU时间很短,基本上没有样本点击它,所以为了得到它除以零的百分比。
OTOH如果样品是在挂钟时间,你会得到第一个输出。
更好的分析器类型是在挂钟时间对调用堆栈进行采样并将包含时间作为总数的百分比进行采样,并在代码行级别提供给您,而不仅仅是函数。这很有用,因为它可以直接衡量如果生产线执行得少可以节省多少,几乎没有任何问题可以隐藏起来。此类分析器的示例是Zoom和LTProf,我告诉OProfile可以这样做。 a simple method适用于任何语言,只需要一个调试器。