2011-12-21 17 views
2

私のアプリケーションは、多くのプロパティを含むオブジェクトは、それらのいくつかは、光と重い他人であることを操作する可変必要なプロパティを持つオブジェクト(計算、DBのクエリを必要とします)。 一部のコンテキストでは、すべてのプロパティにアクセスする必要があります(グリッドビューなどの他のコンテキストで、またはオブジェクトが別のオブジェクトのメンバーとして使用されている場合)、いくつかのプロパティにアクセスする必要があります。最適化が

私はすでに、できるだけ遅く重いメンバーの読み込みを遅らせるが、私は必要としない性質を「運ぶ」を避けるために続行する方法がわかりません。

私は、この問題に対応するため、各クラスの追加「光」バージョンを作成するように言われましたが、それはそうするために多くの時間を要するので、私のアプリケーションは、50の以上のクラスが含まれています。また、同じクラスの複数のバージョンを使用すると、他の問題も発生します。

どのソリューションが最適化されていますか?複数のクラスのバージョンを作成することは理にかなっていますか? 不必要なプロパティがnullのままになる場合はどうなりますか?これらのプロパティがないと、ヌル(割り当てられていない)プロパティが同じよりも重いオブジェクトですか?

ご回答いただきありがとうございます。

+0

おそらく、構成オブジェクトを使用することができます。つまり、重いプロパティを持つ別のクラスを使用していて、オリジナルのものを使用している可能性があります。それはかなり大きな変更になるでしょう。 –

+0

あなたはどんな費用を心配していますか?荷物を積み込むことは高価ですが、何も手をつけないでコストを「運びます」。 –

+0

@HenkHolterman私は、私が使用するオブジェクトのコレクションについて(他のものの中でも)30のプロパティのうち5つを言いますと心配しています。コレクションに50個のオブジェクトが含まれている場合、50 * 25個の不要なプロパティが作成されます。これにほとんど費用がかからなければ、それは本当に問題ではありません。 –

答えて

0

は、あなただけの光プロパティを初期化するcounstructorを作成することができますように。また、重いプロパティの初期化を怠惰にする(アクセス時にのみ初期化する)。その後、すべてのプロパティを持ちますが初期化されていない軽量オブジェクトを作成できます。

1

.NET 4.0では、重い/大きなオブジェクトインスタンスを遅延初期化するためのラッパークラスであるLazyクラスが導入されました。これは、最初にアクセスされたとき(および最初のときのみ)ラップされたオブジェクトインスタンスを初期化する.Valueプロパティを提供します。 .Valueが決してアクセスされない場合、ラップされるオブジェクトインスタンスは決して初期化されません。しかし、あなた自身がすでにあなた自身でこのようなことをしているように思えます。

オブジェクトが重い場合、プロパティのない軽量クラスまたはNULL変数を持つ元のクラス:質問のプロパティが参照型である場合、唯一の浪費は参照型へのポインタですx86ではプロパティごとに4バイト、x64ではプロパティごとに8バイトのいずれかです。 .NETでの空のクラスインスタンスのデフォルトの最小サイズは約24バイトです。例えば

public class MyClassLight 
{ 
    public int PropertyInt { get; set; } // 4 byte value type 
    public OtherClass1 PropertyOtherClass1 { get; set; } // 4 or 8 byte reference type 
} 

public class MyClassHeavy 
{ 
    public int PropertyInt { get; set; } // 4 byte value type 
    public string PropertyString { get; set; } // 4 or 8 byte reference type 
    public OtherClass1 PropertyOtherClass1 { get; set; } // 4 or 8 byte reference type 
    public OtherClass2 PropertyOtherClass2 { get; set; } // 4 or 8 byte reference type 
} 

のはMyClassLightのインスタンスはオーバーヘッド+ 4バイト+ 4バイト24バイト=メモリの32のバイトを要するだろう、あなたは、x86上で実行されていたとしましょう。

MyClassHeavyは、24バイトのオーバーヘッド+ 4バイト+ 4バイト+ 4バイト+ 4バイト=メモリの40バイトであろう。

重いクラスに参照型の50個のプロパティがあっても、それらをNULLにすると、インスタンスごとに余分な200バイトのメモリが必要になります(クラスではポインタのメモリを予約する必要があるためいくつかのポイント)。これらのオブジェクトがメモリに何十万または何百万もある場合、オブジェクトあたり200バイトが問題になるかもしれませんが、そうでない場合は無視できます。

50クラスの2つのバージョンを持っていることの追加複雑さは、それだけの価値は思えません。しかし、あなたがそのルートに行く必要があるなら、私はそれをリファクタリングして両方のクラス(軽量と重)が共有するプロパティだけを含むインターフェイスを作成し、できるだけコンクリートクラスの代わりにインターフェイスを使用するようにコードをリファクタリングします軽いクラスと重いクラスの両方で。