1

次のように、よりパフォーマンスの高いaTuple<int, int>またはaは何ですか。generic class

   public class Interval<T>
    {
       public T From, To;

       public static Interval<T> Create(T from, T to)
       {
          Interval<T> range = new Interval<T>();

                range.From = from;
                range.To = to;

                return range;
            }
        }
   }

使用シナリオ-これらのオブジェクトの大規模なコレクション(100K ++)は、を使用してフィルタリングされLINQます。私は現在、一般的なクラスを持っており、より無脂肪で、できればもっと速く何かに移行することを考えています。を使用するように切り替えることで速度が上がるTupleのだろうか?

4

3 に答える 3

4

Tuple<int, int>aと anのコンパイル済みコードを見ると、Interval<int>それらを区別するのは難しいでしょう。

それらがメモリに格納される方法は同じです。


structa の代わりに aを使用することも検討できますclass

public struct Interval<T> {

   public T From { get; private set; }
   public T To { get; private set; }

   public Interval(T from, T to) {
     From = from;
     To = to;
   }

}

構造体には値のセマンティクスがあるため、場合によっては使用方法が異なります。適切に機能する構造体を実装するのは簡単ではありませんが (関連する比較と変換を実装するなど)、多くのメモリを節約できます。クラスには約 12 バイトまたは 24 バイト (プラットフォームによって異なります) のオーバーヘッドがあり、これは構造体では得られません。

于 2012-09-28T14:10:18.080 に答える
1

さらに重要なことは、非常に大きなデータ コレクションを処理している場合は、オブジェクトを構造体として宣言することです。構造体の配列はメモリの一部であり、クラスの配列は配列の1つのオブジェクトであり、メンバーごとに、標準の「クラスオーバーヘッド」を持つ別のオブジェクトがあります

于 2012-09-28T14:15:57.703 に答える
1

Jon Skeet による回答があるので、これ以上追加する必要はありません。しかし、Tuple が何らかのマジックを実装していると想定しているようです。ジェネリック クラスには実装されません。今のソース コードを見ているTuple<T1,T2>ところですが、プロパティにフィールドがカプセル化され、ToString() と IStructuralComparable が実装されている点を除いて、既にあるものと実際には同じです。

全体像を見て、LINQ クエリの最適化、IEnumerable の複数の列挙型の検索、ある種のキャッシュや遅延読み込みの使用など、最適化の他の方法を検討し始めます。2 つの int を含む単なる構造体のように見えるものを実際に最適化することはできません。

于 2012-09-28T14:22:25.237 に答える