私は今すぐsoem時間のために共有ポインタを使用しています。私のプログラムにはパフォーマンスの問題があります...共有ポインタがパフォーマンス低下につながるかどうかを知りたいと思います。もしそうなら、どれくらい難しいですか?どうもありがとう。共有ポインタとパフォーマンス
私のプログラムがのstd :: tr1を:: shared_ptrの
私は今すぐsoem時間のために共有ポインタを使用しています。私のプログラムにはパフォーマンスの問題があります...共有ポインタがパフォーマンス低下につながるかどうかを知りたいと思います。もしそうなら、どれくらい難しいですか?どうもありがとう。共有ポインタとパフォーマンス
私のプログラムがのstd :: tr1を:: shared_ptrの
共有ポインタが参照カウントされている使用して、マルチスレッドです。特に、マルチスレッドを使用している場合は、参照カウントの増分と減分にかなりの時間がかかります。ここでマルチスレッドがうまくいかない理由は、の場合、にスレッド間で共有ポインタを渡した場合、参照カウントがそれらのスレッド間で共有されるため、スレッド間で操作を同期させる必要があります。それはかなり物事を遅くすることができます。
編集:かなり遅いスレッドインターロックがかなり単純な操作を行うことができるかどうか気になる人は、CoW Stringsという実装をいくつか使用してHerb Sutterのテストを参照してください。彼のテストは完璧ではありませんが(Windowsのみでテストされているなど)、期待できるスローダウンについてはまだ考えています。ほとんどの実用的な目的のために、CoW文字列をshared_ptr<charT>
のようなものと考えることができますが、多くの(無関係な)メンバー関数が追加されています。
これは、スレッドを認識する参照カウントメカニズムを使用する場合にのみ当てはまります。これはドキュメントによると思われません。http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety – JaredPar
彼はshared_ptrが何を使用しているかは言いません。いくつかはすでにスレッドを認識していて、そうでないものもあります。彼が使っているものがあるかどうかは疑問の余地があります。それは、パフォーマンスの問題の原因となる可能性がかなり遠いということは確かです。 –
詳細情報を追加 – Guest
データを元にして、この質問に正しく答えることは事実上不可能です。アプリケーションでパフォーマンスの問題を引き起こしていることを真に伝える唯一の方法は、プログラムでプロファイラを実行して出力を調べることです。
つまり、shared_ptrがスローダウンを引き起こす可能性は非常に低いです。 shared_ptr型と多くの初期の自家製の変種は、ますます多くのC++プログラムで使用されています。私は自分の仕事(家庭の専門家)でそれを使用します。私は自分の仕事用アプリケーションのプロファイリングに多くの時間を費やしました。そして、shared_ptrは、自分のコードやアプリケーション内で実行されている他のコードの問題にさえ近づいていません。エラーが他の場所にある可能性は非常に高いです。
非常にありそうもありません。ほとんどの場合、ポインタを周回する必要があります。
共有ptrsの影響は通常は軽微です。適切な実装と適切な最適化コンパイラを想定して、問題になるようなエッジケースを構築することさえ困難です。共有PTRの
影響:
を割り当てサイズを増加させました。
非常に小さいオブジェクト(たとえば、数千万のshared_ptr<int>
)への共有ポインタが多く、メモリの限界に近づいている場合にのみ問題になります。余分な割り当ては、内側ループ内で割り当て
shared_ptr
allcoatesトラッキングオブジェクト(参照カウント、弱いカウント及び削除部)の
増加NUMERをキャッシュ/ NUMAレベルを超えた場合に顕著なパフォーマンスの低下のために小さい可能性があります。これは、ヒープに負荷をかけることになり、割り振りと割り当て解除の合計数が高い場合、一般的な減速を引き起こす可能性があります。
はmake_shared
を使用することによって回避することができ、
をカウントする単一の割り当てにリファレントとtrackngオブジェクトを置く
参照はポインタのコピーのコストを増大させます。シングルスレッドアプリケーションでは、とにかくポインタをコピーするのに費やす時間があなたのものにすぎないことに気付くでしょう。マルチスレッド化されたアプリケーションでは、同じポインタで競合する必要があります。
コピーコストはshared_ptr<T> const &
などを渡すことで多くの場所で対応できます。関数の引数として。追加の参照解除のコスト
を逆参照
は、最適化コンパイラのリリースビルドではゼロです。デバッグビルドは、多くの場合、関数呼び出しと追加のNULLチェックと同じです。それでも、特にデバッグビルドでは、違いを生み出すために参照を逆参照するのにほとんどの時間を費やす必要があります。
パフォーマンスモニタやプロファイラを使用して、スローダウンの原因を特定し、特定のボトルネックがあるかどうかを確認します。
プログラムのパフォーマンスに問題があると思われる場合は、問題の原因を推測するのは完全に当然ですが、賭けをしたい場合は、100%近い可能性があります。プロファイリングによって問題が検出されることがあります。 This is the method I use.
パフォーマンスを低下させる可能性のあるものは、関数パラメータとしてshared_ptrを過度に渡すことです。それに対する解決策は、shared_ptrへの参照を渡すことです。しかし、これはマイクロ最適化が本当に必要なときには、これだけにそれを行う
編集:
を変更する必要がある場合にパフォーマンスについて推測しないでくださいポインターへの参照を渡す代わりに、ポインタ
アプリが65バイトのGoogleプロトコルメッセージまたは85バイトのASN.1メッセージに含まれる可能性のある700バイトのXMLメッセージを渡している場合は、おそらく問題にはなりません。しかし、1秒に100万回の処理をしているなら、ポインタを渡すのに2回のフル・リード・モディファイ・ライト(RMW)サイクルを追加するコストを払拭しません。
フル・リード・モディファイ・ライトは50 nsのオーダであり、2つは100 nsです。このコストは、2つのCASと同じlock-incとlock-decのコストです。これは、Windowsクリティカルセクションの予約と解放の半分です。これは、1つのマシンサイクルプッシュ(2.5GHZマシンでは400 PICO秒)と比較されます。
また、実際にカウントを含むキャッシュラインを無効にするためのその他のコスト、BUSロックの影響他のプロセッサーなど
constリファレンスによるスマートポインターの受け渡しは、ほとんど常に優先されます。被呼者がpointeeの有効期間を保証または制御したいときに新しい共有ポインタを作成しない場合これは呼び出される側のバグです。スレッドセーフな参照をスマートポインタを値渡しに渡すことは、単にパフォーマンスヒットを求めているだけです。
参照カウントポインタを使用することで、間違いなく生存時間が短縮されますが、共有ポインタを値で渡して、呼び出し先の欠陥を防御しようとすると、まったくナンセンスになります。
参照カウントを過度に使用すると、1ミリ秒あたりのメッセージ数(mps)を同じハードウェア上で150k mpsを処理する大規模なプログラムにすることができます。突然、サーバーの半分のラックと1億ドルの電力が必要になります。
参照カウントなしでオブジェクトのライフタイムを管理できる場合は、常により効果的です。
単純な改善の例として、オブジェクトをファンアウトする場合、ファンアウトの幅(nとする)が各ファンアウトで個別に増加するのではなく、nずつ増加することがわかります。
ところで、CPUがロックプレフィックスを見るとき、実際には "ああ、これは傷ついていない"と言います。
すべてのことが言われている、私はあなたがホットスポットを確認する必要があります皆に同意します。
Heh。答えはありませんが、私はタイトルが表現された方法を愛しています。突然、共有ポインタ命令がパイプラインの後ろに入ってくるのを見ると、CPUはメリハリのある命令を実行しています。 "ああ、これはhuuuuurtになるだろう......ああ! –
あなたは問題が共有ポインタだと思いますか? –
人はCPU時間を無駄にしていると言っています。P – Guest