使用Valgrind来知道每个函数所花费的时间(以秒为单位)

40

有没有Valgrind的扩展程序可以在命令行窗口中使用,帮助我知道C代码中每个函数花费的时间(秒)?

谢谢 =)


callgrind是valgrind的性能分析工具,用于输出每个函数的机器周期等内容。但是,您也可以使用gcc的性能分析标志编译程序,以创建不需要valgrind的性能分析输出... callgrind: http://valgrind.org/docs/manual/cl-manual.html - Christian Goltz
我从昨天开始尝试使用手册,但是我没有成功地获得每个函数中花费的“秒数”。我是不是漏掉了什么? - Syntax_Error
在每个函数中都存在歧义:1)独占 vs. 包含,2)总数 vs. 每次调用的平均值。 - Mike Dunlavey
@Mike:只要我在每次模拟中获得一致的数据并且以秒为单位获得时间,那就没关系。 - Syntax_Error
3个回答

33

进行机器指令分析时,请使用valgrind的 callgrind (同时,cachegrind 可以执行缓存和分支预测分析,这非常好用)。

进行时间测量时,请使用谷歌的CPU性能分析工具,它的结果比gprof更好。您可以设置采样频率,并将输出显示为漂亮的注释调用图。


25

Valgrind不适合用于测量时间,因为在valgrind中运行应用程序会扭曲结果(减速,CPU与I/O)。因此,valgrind分析工具Callgrind不测量时间,而是测量CPU指令。如果您的瓶颈是CPU绑定的(因此CPU指令很重要),那么所测量的CPU指令将与花费的时间成比例。如果涉及大量I/O或多个进程,则这是无用的。然后您应该使用采样分析器,如sysprof或gprof (编辑2020:perf)。它以间隔检查进程位于哪个函数中,并提供更少扭曲的结果。


2
好的信息,但是 gprof 只能用于 CPU。sysprof 的文档非常不详细,但我怀疑它也只能用于 CPU。gprof 只会对程序计数器进行采样(这就是为什么它只能用于 CPU)。它还会计算一个例程调用另一个例程的次数,并使用此来尝试估计调用者的包容时间,但这非常有问题,特别是在递归中。有一种采样分析器可以解决所有这些问题 - Zoom - Mike Dunlavey
@Mike Dunlavey:它可以测量CPU使用情况。我的意思是:如果CPU时间不是主要因素,使用这种分析工具通常会更少侵入性并提供更真实的测量结果。 - Frank Osterfeld
好的回答。同时想分享https://web.stanford.edu/class/cs107/resources/callgrind - Deepak Tatyaji Ahire

3

使用这个链接。我认为像Callgrind这样的工具应该可以解决问题。


3
我一直在使用Callgrind,它实际上很有用,但是它没有显示以秒为单位的时间。Kcachegrind可以解决这个问题,但需要使用界面,而我想要绕过它!你有其他办法吗? - Syntax_Error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接