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
来获得速度?
答案 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的多个枚举或使用某种缓存或延迟加载。你无法真正优化看起来只是包含两个整数的结构。