我今天试用了linux'perf实用程序,但在解释其结果时遇到了困难.我习惯了valgrind的callgrind,这当然是一种与基于采样的性能测试方法完全不同的方法.
我所做的:
perf record -g -p $(pidof someapp)
perf report -g -n
现在我看到这样的情况:
+ 16.92% kdevelop libsqlite3.so.0.8.6 [.] 0x3fe57 ↑ + 10.61% kdevelop libQtGui.so.4.7.3 [.] 0x81e344 ▮ + 7.09% kdevelop libc-2.14.so [.] 0x85804 ▒ + 4.96% kdevelop libQtGui.so.4.7.3 [.] 0x265b69 ▒ + 3.50% kdevelop libQtCore.so.4.7.3 [.] 0x18608d ▒ + 2.68% kdevelop libc-2.14.so [.] memcpy ▒ + 1.15% kdevelop [kernel.kallsyms] [k] copy_user_generic_string ▒ + 0.90% kdevelop libQtGui.so.4.7.3 [.] QTransform::translate(double, double) ▒ + 0.88% kdevelop libc-2.14.so [.] __libc_malloc ▒ + 0.85% kdevelop libc-2.14.so [.] memcpy ...
好的,这些函数可能很慢,但是我如何找出它们是从哪里被调用的呢?由于所有这些热点都位于外部库中,我认为没有办法优化我的代码.
基本上,我在寻找某种带有累计成本注释的调用图,其中我的函数比我调用的库函数具有更高的包容性采样成本.
这在perf中是可能的吗?如果是,怎么做?
注意:我发现"E"打开调用图并提供更多信息.但是调用图通常不够深入,并且/或者随机终止,而没有给出在哪里花费了多少信息的信息.例子:
- 10.26% kate libkatepartinterfaces.so.4.6.0 [.] Kate::TextLoader::readLine(int&... Kate::TextLoader::readLine(int&, int&) Kate::TextBuffer::load(QString const&, bool&, bool&) KateBuffer::openFile(QString const&) KateDocument::openFile() 0x7fe37a81121c
这可能是我在64位上运行的问题吗?另请参见:http://lists.fedoraproject.org/pipermail/devel/2010-November/144952.html(我没有使用fedora,但似乎适用于所有64位系统).