0

パフォーマンスの問題により、一部の C++ コードをリファクタリングしようとしていますが、これを解決する最善の方法を考えています。大規模システムのコア コンポーネントである DataGatherer というクラスがあります。このクラスはシリアル化されてデータ ストリーム経由で送信され、コピーされてテーブルに格納され、同時実行のためにコピーされます (元の DataGatherer オブジェクトにアクセスするのではなく、コピーをチェックアウトします)。コピー演算子と代入演算子の両方が使用されていることを知らせるために、例をリストします。

問題は、DataGatherer オブジェクトが非常に大きくなる可能性があることです。これらのオブジェクトには、収集されたデータの大量のコレクションと、データに関する統計およびメタデータが本質的に含まれているためです。多くの場合、必要なのは統計とメタデータだけであり、バックエンド データ コレクションは必要ありません。

ここで役立つ設計パターンはありますか? おそらく、より一般的な質問は、ほとんどの場合、オブジェクトの一部しか必要としないのに、オブジェクトが内部で非常に緊密に結合されているため、分割がほぼ不可能な場合はどうするかということです。

私が思いついたアイデア、

  • クラスを DataGatherer クラスと DataGathererBackend オブジェクトへのポインターに分割します。DataGathererBackend が使用されていないときに DataGathererBackend をコピーするすべてのオーバーヘッドを回避するために、ほとんどの場合、浅いコピーを返します。浅いコピーが必要な場合と深いコピーが必要な場合の処理​​のすべての面倒と、バックエンド オブジェクトの NULL ポインターを持つ DataGatherer オブジェクトに頼らなければならない一般的な厄介なフォームがあるため、これを行うのは嫌いです。それらの場合に必要です。

  • クラスを DataStatistics と Data に分割し、両方をラップして含む 3 番目のクラスを作成します。

  • 他のアイデア?

4

2 に答える 2

1

統計だけが必要な場合は、値またはconst参照で返し、コピー演算子からの取得を統計ゲッター関数の呼び出しに変更できる統計の構造体はどうでしょうか。

于 2012-10-11T02:49:52.747 に答える
1

1 つのオプションは、最初に (バックエンド?) データをコピーしないようにコピー コンストラクターまたは代入演算子をオーバーロードし、参照カウントし、データが変更された場合にのみコピーする、コピー オン ライトを実行できることです。データ変更メンバーをオーバーロードできる限り、 iterface が変更されないように DataGatherer に対して内部的に行うことができます。しかし、データへのポインターを既に公開していて、どこでも使用している場合は、さらに難しくなります。

于 2012-10-11T01:21:10.750 に答える