如标题所说,我想知道这两个命令之间的区别以及它们产生的结果。
来自阅读this我知道 gprof 需要一个额外的标志(-g,gdb 也需要吗?),但这并没有给我关于分析器之间差异的答案。
最佳答案
gprof
是专门发明的,因为 prof
只给你“ self 时间”。
“self time”告诉您在每个例程中找到程序计数器的总时间的分数。
如果您需要考虑的唯一类型的“瓶颈”通过调用堆栈底部的剃须周期来解决,那很好。
您通过减少对子例程的调用次数来解决的“瓶颈”类型如何?
这就是 gprof
应该帮助您找到的,通过向调用者“收回”自己的时间。
例程中的“包含时间”包括它的“ self 时间”,加上从它调用的例程中冒出来的时间。
以下是 gprof
功能的简单示例:
A 调用 B 十次,B 调用 C 十次,C 执行一些 CPU 密集型循环 10 次采样。
请注意,没有样本落入 A 或 B,因为程序计数器几乎所有时间都花在 C 上。
gprof
,通过计算调用次数并跟踪调用者,进行一些计算并向上传播时间。
所以你看,加快这个程序的一种方法是让 A 调用 B 的次数更少,或者让 B 调用 C 的次数更少,或者两者兼而有之。
prof
无法为您提供此类信息 - 您必须猜测。
如果您正在考虑使用 gprof
,be aware of its problems ,比如不提供行级信息、对 I/O 视而不见、对递归感到困惑以及误导您思考某些有助于您发现问题的事情,例如采样率、调用图、调用计数等。
请记住,它的作者只声称它是一种测量工具,而不是一种问题发现工具,尽管大多数人认为它是后者。
关于c - prof 和 gprof 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612370/