C# 元组与泛型类性能

C# 元组与泛型类性能,c#,C#,对于元组或泛型类来说,什么更有效 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;

对于
元组
泛型类
来说,什么更有效

   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;
            }
        }
   }
公共类间隔
{
公共T从,到;
创建公共静态间隔(T从,T到)
{
区间范围=新区间();
范围从=从;
范围到=到;
返回范围;
}
}
}

使用场景-使用
LINQ
对这些对象的大型集合(100K++)进行过滤。我现在有一些普通的课程,正在考虑转向更无脂肪的课程,希望更快。想知道我是否可以通过切换到使用
元组来提高速度?

如果您查看
元组和
间隔的编译代码,很难将它们区分开来

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


您也可以考虑使用<代码>结构> <代码>而不是<代码>类< /代码>:

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;
   }

}
公共结构间隔{
来自{get;private set;}的公共T
公共T到{get;私有集;}
公共间隔(T从,T到){
From=From;
To=To;
}
}

结构有一个值语义,因此在某些情况下用法会有所不同。实现一个运行良好的结构(例如,实现相关的比较和转换)并不是那么简单,但它会为您节省大量内存。一个类的开销约为12或24字节(取决于平台),这是结构所不能得到的。

如果您查看编译后的代码中的
元组和
间隔,就很难区分它们

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


您也可以考虑使用<代码>结构> <代码>而不是<代码>类< /代码>:

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;
   }

}
公共结构间隔{
来自{get;private set;}的公共T
公共T到{get;私有集;}
公共间隔(T从,T到){
From=From;
To=To;
}
}

结构有一个值语义,因此在某些情况下用法会有所不同。实现一个运行良好的结构(例如,实现相关的比较和转换)并不是那么简单,但它会为您节省大量内存。一个类的开销大约为12或24字节(取决于平台),这是结构所不能得到的。

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

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

您有一个Jon Skeet的答案,因此没有更多要添加的内容。但是你显然假设Tuple正在实现某种你的泛型类不会实现的魔法。我现在只看
Tuple
的源代码,它实际上与您已有的代码相同,只是它将字段封装在属性中,并实现了ToString()和IsStructuralComparable


我将从更大的角度来看,并开始研究其他优化方法,例如优化LINQ查询、查找IEnumerable的多个枚举或使用某种缓存或延迟加载。您无法真正优化似乎只是包含两个int的结构。

您有Jon Skeet的答案,因此没有更多的内容可添加。但是你显然假设Tuple正在实现某种你的泛型类不会实现的魔法。我现在只看
Tuple
的源代码,它实际上与您已有的代码相同,只是它将字段封装在属性中,并实现了ToString()和IsStructuralComparable


我将从更大的角度来看,并开始研究其他优化方法,例如优化LINQ查询、查找IEnumerable的多个枚举或使用某种缓存或延迟加载。您无法真正优化似乎只是包含两个int的结构。

编写一些代码来分析ita
Tuple
,顺便说一句,它是一个泛型类。基于我进行的小测试,我看不出有什么不同。我想问人们是否值得这么做。@ USE1514042:您可以考虑使用泛型结构而不是类。也许。对于
Interval
,我希望在
T
的值之间进行某种比较。但从根本上说,我非常怀疑你会看到任何不同。如果您有性能问题,您应该证明它们实际上是一个问题,然后测试一个替代方案。否则,您几乎肯定会优化错误的代码。两者之间的差异不值得担心。如果性能是一个问题,您将无法在这里找到解决方案。这里的理想解决方案是更有意义的解决方案,而不是“最快”的解决方案。别再做一个赖斯了,在这里或那里担心一纳秒,去修复那些重要的部分。写一些代码来描述ita
Tuple
,顺便说一句,它是一个通用类。基于我进行的小测试,我看不出有什么不同。我想问人们是否值得这么做。@ USE1514042:您可以考虑使用泛型结构而不是类。也许。对于
Interval
,我希望在
T
的值之间进行某种比较。但从根本上说,我非常怀疑你会看到任何不同。如果您有性能问题,您应该证明它们实际上是一个问题,然后测试一个替代方案。否则,您几乎肯定会优化错误的代码。两者之间的差异是不值得的