c - prof 和 gprof 有什么区别?

标签 c profiling

如标题所说,我想知道这两个命令之间的区别以及它们产生的结果。

来自阅读this我知道 gprof 需要一个额外的标志(-g,gdb 也需要吗?),但这并没有给我关于分析器之间差异的答案。

最佳答案

gprof 是专门发明的,因为 prof 只给你“ self 时间”。 “self time”告诉您在每个例程中找到程序计数器的总时间的分数。 如果您需要考虑的唯一类型的“瓶颈”通过调用堆栈底部的剃须周期来解决,那很好。

您通过减少对子例程的调用次数来解决的“瓶颈”类型如何? 这就是 gprof 应该帮助您找到的,通过向调用者“收回”自己的时间。 例程中的“包含时间”包括它的“ self 时间”,加上从它调用的例程中冒出来的时间。 以下是 gprof 功能的简单示例:

enter image description here

A 调用 B 十次,B 调用 C 十次,C 执行一些 CPU 密集型循环 10 次采样。 请注意,没有样本落入 A 或 B,因为程序计数器几乎所有时间都花在 C 上。 gprof,通过计算调用次数并跟踪调用者,进行一些计算并向上传播时间。

所以你看,加快这个程序的一种方法是让 A 调用 B 的次数更少,或者让 B 调用 C 的次数更少,或者两者兼而有之。 prof 无法为您提供此类信息 - 您必须猜测。

如果您正在考虑使用 gprofbe aware of its problems ,比如不提供行级信息、对 I/O 视而不见、对递归感到困惑以及误导您思考某些有助于您发现问题的事情,例如采样率、调用图、调用计数等。 请记住,它的作者只声称它是一种测量工具,而不是一种问题发现工具,尽管大多数人认为它是后者。

关于c - prof 和 gprof 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612370/

相关文章:

c - 结构体 C 中的 sizeof 数组

c - 获取最大值的程序出错

C位屏蔽AND运算问题

WPF Performance Suite Visual Profiler 不起作用

gcc - g++/gcc在展开递归内联函数方面的效果如何?

haskell 分析显示 "total time = 0.00 secs",但这不是真的

c - 如何在 C 中浏览任意长度的字符串数组?

c - 执行 strlen(const) 的最佳方法是什么?

android - 如何在 android profiler 中搜索某个方法?

haskell - Cabal 在需要分析库时没有安装依赖项?