用 <spontaneous> 解释 gprof 输出
Posted
技术标签:
【中文标题】用 <spontaneous> 解释 gprof 输出【英文标题】:Interpreting gprof output with <spontaneous> 【发布时间】:2011-09-30 05:51:02 【问题描述】:我试图在我的程序中找到一个性能问题,因此通过分析来检测代码。 gprof 创建一个像这样的平面配置文件:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
27.97 4.10 4.10 std::_Deque_iterator<char, char&, char*>::_Deque_iterator(std::_Deque_iterator<char, char&, char*> const&)
6.96 5.12 1.02 std::_Deque_iterator<char, char&, char*>::difference_type std::operator-<char, char&, char*>(std::_Deque_iterator<char, char&, char*> const&, std::_Deque_iterator<char, char&, char*> const&)
5.12 5.87 0.75 std::__deque_buf_size(unsigned int)
4.23 6.49 0.62 std::_Deque_iterator<char, char&, char*>::operator+=(int)
3.41 6.99 0.50 std::deque<char, std::allocator<char> >::begin()
1.91 7.27 0.28 7896 0.04 0.04 std::vector<MyClass, std::allocator<MyClass> >::_M_insert_aux(__gnu_cxx::__normal_iterator<MyClass*, std::vector<MyClass, MyClasst> > >, MyClassconst&)
1.91 7.55 0.28 std::deque<char, std::allocator<char> >::size() const
1.91 7.83 0.28 std::_Deque_iterator<char, char&, char*>::_S_buffer_size()
后面有很多行,时间更短。
第一个问题:认为 std::deque 似乎有问题是一个有效的假设吗?问题是:我知道我们正在使用 std::deque,但我不知道 <char>
的用法。
如果这个假设成立,那么查看调用堆栈并查看该双端队列的使用位置似乎是有意义的。然而,所有与deque<char>
相关的条目仅由<spontaneous>
调用!
仅举一个例子:
index % time self children called name
<spontaneous>
[1] 28.0 4.10 0.00 std::_Deque_iterator<char, char&, char*>::_Deque_iterator(std::_Deque_iterator<char, char&, char*> const&) [1]
有什么方法可以了解更多关于这个双端队列的信息吗?
感谢任何提示!
【问题讨论】:
根据我的经验,对于统计抽样,google-perftools 产生的输出比 gprof 有用得多。 那是 gprof。它指责无辜的代码,完全忽略了真正的问题。 Alternatives to Gprof. 我使用 gprof 是因为它似乎是在嵌入式平台上进行分析的最简单的选择(特别是因为我没有很多 Linux 经验),但感谢您的提示,我会考虑尝试别的东西。 【参考方案1】:显然,自发是 gprof 在无法计算出调用函数时使用的。我会尝试使用 -pg 重新编译所有代码(您是否可能错过了一些文件?)。另外,请确保您已打开优化。内联通常会使这些小函数消失在调用函数中,这通常更有用。
【讨论】:
我猜,“另外,请确保您已关闭”优化。我说的对吗? @skwllsp 我相信一般来说你希望在分析时打开优化有几个原因。我的感觉是内联消除了配置文件中的噪音,我认为这可能有助于 OP。启用优化也很重要,因为编译器优化可能会改变代码中瓶颈的位置。你不想花很长时间优化你的代码,却发现编译器比你做得更好。【参考方案2】:接受的答案是正确的。您可能会发现大量 <spontaneous>
条目的另一个原因是,如果您传递了错误的可执行文件 gprof
。确保将生成 gmon.out
文件的相同编译二进制文件传递给 gprof
以生成分析。
【讨论】:
以上是关于用 <spontaneous> 解释 gprof 输出的主要内容,如果未能解决你的问题,请参考以下文章
菜鸡读论文Recognizing Spontaneous Micro-Expression Using a Three-Stream Convolutional Neural Network