用<spontaneous>解释gprof输出

Phi*_*ipp 6 c++ optimization gprof

我试图在我的程序中找到性能问题,从而通过分析对代码进行检测.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()
Run Code Online (Sandbox Code Playgroud)

其次是许多行,时间更短.

第一个问题:认为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]
Run Code Online (Sandbox Code Playgroud)

有没有办法找到关于这个双端队列的更多信息?

谢谢你的任何提示!

Bow*_*ens 3

显然,当 gprof 无法计算出调用函数时,它会使用自发性。我会尝试使用 -pg 重新编译所有代码(您是否可能错过了一些文件?)。另外,请确保您已打开优化。内联通常会使这些小函数消失在调用函数中,这通常更有用。

  • @skwllsp 我相信一般来说您希望在分析时打开优化有几个原因。我的感觉是内联消除了配置文件中的噪音,我认为这可能对操作有所帮助。启用优化也很重要,因为编译器优化可能会改变代码中瓶颈的位置。您不想花费很长时间优化代码,却发现编译器可以比您做得更好。 (5认同)