アプリケーション全体で std::tr1::shared_ptr を広範囲に使用しています。これには、オブジェクトを関数の引数として渡すことも含まれます。次の点を考慮してください。
class Dataset {...}
void f( shared_ptr< Dataset const > pds ) {...}
void g( shared_ptr< Dataset const > pds ) {...}
...
shared_ptr を介してデータセット オブジェクトを渡すと、f および g 内での存在が保証されますが、関数は何百万回も呼び出される可能性があり、多くの shared_ptr オブジェクトが作成および破棄されます。最近実行したフラット gprof プロファイルのスニペットを次に示します。
各サンプルは 0.01 秒としてカウントされます。 %累積自己自己合計 time seconds seconds コール数/コール数/コール名 9.74 295.39 35.12 2451177304 0.00 0.00 std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&) 8.03 324.34 28.95 2451252116 0.00 0.00 std::tr1::__shared_count::~__shared_count()
そのため、実行時間の約 17% が shared_ptr オブジェクトの参照カウントに費やされました。これは正常ですか?
私のアプリケーションの大部分はシングル スレッドであり、一部の関数を次のように書き直すことを考えていました。
void f( const Dataset& ds ) {...}
呼び出しを置き換える
shared_ptr< Dataset > pds( new Dataset(...) );
f( pds );
と
f( *pds );
プログラムの流れがf()内にある間、オブジェクトが破壊されないことが確実にわかっている場所で。しかし、一連の関数シグネチャ/呼び出しを変更する前に、shared_ptr を渡すことによる典型的なパフォーマンス ヒットがどのようなものかを知りたいと思いました。頻繁に呼び出される関数には shared_ptr を使用しないようです。
任意の入力をいただければ幸いです。読んでくれてありがとう。
-アルテム
更新:一部の関数を accept に変更した後const Dataset&
、新しいプロファイルは次のようになります。
各サンプルは 0.01 秒としてカウントされます。 %累積自己自己合計 time seconds seconds コール数/コール数/コール名 0.15 241.62 0.37 24981902 0.00 0.00 std::tr1::__shared_count::~__shared_count() 0.12 241.91 0.30 28342376 0.00 0.00 std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&)
デストラクタの呼び出し数がコピー コンストラクタの呼び出し数よりも少ないことに少し困惑していますが、関連するランタイムの減少には全体的に非常に満足しています。アドバイスをくれてありがとう。