Tuple vs Generic class Performance

时间:2012-09-28 14:06:51

标签: c#

Tuple<int, int>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;
            }
        }
   }

使用场景 - 使用LINQ过滤这些对象的大型集合(100K ++)。我目前有通用课程,考虑转向更无脂肪的东西,希望更快。不知道我是否会通过切换到使用Tuple来获得速度?

3 个答案:

答案 0 :(得分:4)

如果你看一下Tuple<int, int>Interval<int>的编译代码,就很难区分它们。

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


您还可以考虑使用struct代替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个字节(取决于平台),这是结构体无法获得的。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你有Jon Skeet的回答,所以没有更多的补充。但是你显然假设元组正在实施某种类型的魔法,你的泛型类不会。我现在只是查看Tuple<T1,T2>的源代码,它与您已经拥有的内容完全相同,只是它将字段封装在属性中并实现ToString()和IStructuralComparable。

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