2

アプリケーションでさまざまなルーチンにかかる時間を本当に知りたいです。プロファイリングに Dev-C++ IDE と gprof で GCC 3.4.2 を使用しています。結果ファイルの先頭は次のとおりです。

フラットプロファイル:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
  7.48      0.89     0.89                             __gnu_cxx::__exchange_and_add(int volatile*, int)
  7.39      1.77     0.88                             _Unwind_SjLj_Register
  6.22      2.51     0.74                             _Unwind_SjLj_Unregister
  3.70      2.95     0.44  2425048     0.00     0.00  rt::wctree_node<std::vector<OPT_Inst, std::allocator<OPT_Inst> > >::get(std::string, bool&)
  3.28      3.34     0.39                             std::string::operator[](unsigned int)
  3.11      3.71     0.37                             std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
  2.86      4.05     0.34                             std::string::_M_mutate(unsigned int, unsigned int, unsigned int)
  2.69      4.37     0.32                             __gnu_cxx::__atomic_add(int volatile*, int)
  2.61      4.68     0.31    38655     0.00     0.00  SPSBase::containerBoxFillSet(double, double, double, double)

rt::wctree (明らかに私が作成したものではありません) 以外の最初のものを誰かが説明してくれませんか?それらはどこから来て、プログラムの目的は何ですか?

4

1 に答える 1

1

この 2 つ_Unwindは、例外処理のように見えます。

_M_mutate、文字列をコピーしていることを示しているようです (libstdc++ 実装の Copy on Write 動作の実装の詳細)。これは、プロファイル内の文字列デストラクタの存在によって強調されているようです。

内部バッファーは参照カウントされるため、アトミック操作も文字列 COW の動作に由来すると思います。

したがって、あなたの時間の大部分はコピーに費やされているようstd::stringです。

編集:さて、あなたのrt::wctree<>::get(std::string, bool&). パラメータはコピーで渡されます。2425048 コール、2425048 コピー。ここで試してみませんconst&か?

于 2012-07-14T16:17:08.580 に答える