2009-08-14 1 views
1

私は、WPFのDependencyPropertyおよびDependencyObjectシステムと同様の設定をしています。私の特性は一般的です。 BucketPropertyには、すべてのBucketPropertiesを追跡する静的なGlobalIndex(BucketPropertyBaseで定義)があります。バケットには、どのタイプのBucketPropertiesもたくさん持つことができます。バケットは、これらのBucketPropertiesの実際の値を保存して取得します...今、私の質問は、これらの値の格納に対処する方法と、それらを取得するときに型キャストを使用するペナルティは何ですか?私は現在、単純なオブジェクトとしてプロパティ値を保存するBucketEntriesの配列を使用しています。これらの値を保存して返す良い方法はありますか?一般的な値を格納するときのC#のtypecastingとboxing/unboxingのパフォーマンスのペナルティ

は下にsimpliefiedバージョンです:

public class BucketProperty<T> : BucketPropertyBase 
{ 

} 

public class Bucket 
{ 
    private BucketEntry[] _bucketEntries; 

    public void SaveValue<T>(BucketProperty<T> property, T value) 
    { 
     SaveBucketEntry(property.GlobalIndex, value) 
    } 
    public T GetValue<T>(BucketProperty<T> property) 
    { 
     return (T)FindBucketEntry(property.GlobalIndex).Value; 
    } 
} 

public class BucketEntry 
{ 
    private object _value; 
    private uint _index; 
     public BucketEntry(uint globalIndex, object value) 
     { 
      ... 
     } 
} 

答えて

0

私はロックフォードLhotkaのbook on Business Objectsを通して読んだ後に非常に似たセットアップを作成しましたが、私はタイプされたバッキングを維持するために、プロパティの実装を強制することによって、オブジェクトのボクシングの問題を回避しました代わりにフィールド。私はこれがトレードオフであることを知っていますが、私の場合、私は新しい特性を宣言することの簡単さよりもパフォーマンスを重視しました。プロパティのルックアップと管理で型を管理するために、私はラムダ式とジェネリックを非常に重く、これまでのところよく使っています。私はDependency ObjectsとCSLAのパフォーマンスを打ち負かしています。

あなたの質問に答えるために、はい、あなたはオブジェクトボクシングを使用してパフォーマンスヒットを持つでしょう、あなたが保存されるこれらのプロパティによって支えられた値タイプのヒープには、これらの値のフットプリント。パフォーマンスのヒット数は、他の要素の中でこれらのプロパティを定期的に読み書きするかどうかによって異なります。パフォーマンスの違いを感じたいのであれば、ループを実行していくつかの整数をオブジェクトとしてボックスに入れ、同じ値を通常のフィールドに保存するのではなく、小さなテストアプリケーションを作成することをお勧めします。私の推測では、オブジェクトのボクシングやボクシングをやっていないことによって、少なくとも2倍のパフォーマンスを向上させるだろうが、私の言葉をテストに使ってはいけないということです。

関連する問題