1

更高效的 aTuple<int, int>或 ageneric 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

如果您查看 aTuple<int, int>和 an的编译代码Interval<int>,将很难区分它们。

它们在内存中的存储方式是相同的。


您还可以考虑使用 astruct而不是 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

更重要的是,如果要处理如此大的数据集合,请尝试将对象声明为结构。一个结构数组在内存中,一个类数组是该数组的一个对象,然后对于每个成员,您都有另一个具有标准“类开销”的对象

于 2012-09-28T14:15:57.703 回答
1

你有 Jon Skeet 的答案,所以没有什么要补充的了。但是您显然是在假设 Tuple 正在实现某种您的泛型类不会实现的魔法。我只是在看Tuple<T1,T2>现在的源代码,它和你已经拥有的实际上是一样的,除了它封装了属性中的字段并实现了 ToString() 和 IStructuralComparable。

我会看大图并开始寻找其他优化方法,例如优化 LINQ 查询、查找 IEnumerable 的多个枚举或使用某种缓存或延迟加载。您无法真正优化似乎只是包含两个整数的结构。

于 2012-09-28T14:22:25.237 回答