6

プログラムでパフォーマンスの問題を見つけようとしているため、プロファイリングを使用してコードをインストルメント化しました。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]

この両端キューについて詳しく調べる方法はありますか?

ヒントをありがとう!

4

1 に答える 1

3

どうやら、自発的は、呼び出し関数がうまくいかないときに gprof が使用するものです。-pg を使用してすべてのコードを再コンパイルしてみます (一部のファイルが欠落している可能性はありますか?)。また、最適化がオンになっていることを確認してください。インライン化すると、通常、これらの小さな関数が呼び出し元の関数に消えてしまいます。これは、一般的にはより便利です。

于 2011-09-30T06:35:44.243 に答える