如果有的话,CLR中的装箱和拆箱操作有哪些性能改进?

时间:2011-10-13 22:20:26

标签: c# .net clr boxing unboxing

几个月前我参加了一个研讨会,发言人声明自从.NET 1.1以来,装箱或拆箱操作的总成本已经降低。我查看了我的(差)注释,无法确定此语句是否引用了box和unbox指令,或者引用了类(即泛型类型),使得装箱/拆箱不太可能发生。

.NET 1.1和.NET 4.0之间的CLR拳击相关指令是否有性能改进,如果是这样,我在哪里可以找到有关显示收益的测量信息?

2 个答案:

答案 0 :(得分:6)

我无法评论性能(因为你需要进行性能分析等) - 但这里有一个有趣的变化是constrained操作码,特别是 >与泛型。这里的优点是对于像这样的方法:

static void DoSomething<T>(T x, T y) where T : IComparable<T>
{
    if(x.CompareTo(y) < 0) { /* whatever */ }
}

它将对CompareTo使用约束调用,这允许它 使用对值类型(没有unbox)的方法实现的静态调用,或者如果它是引用类型,则使用虚拟调用。通常,在值类型上调用基于接口的方法需要一个框,因此这非常有用。

答案 1 :(得分:1)

应尽可能避免拳击和拆箱。来自MSDN

  

最好避免在必须装箱次数很多的情况下使用值类型,例如在非泛型集合类(如System.Collections :: ArrayList)中。您可以使用泛型集合(如System.Collections.Generic :: List)来避免对值类型进行装箱。拳击和拆箱是计算上昂贵的过程。装箱值类型时,必须创建一个全新的对象。这可能比简单的参考分配长20倍。拆箱时,铸造过程可能需要四倍的分配。

MS已经尽其所能来最大限度地降低拳击作战本身的成本,但是只能做到这一点。

通过从一个代码中消除尽可能多的装箱,可以实现更好的性能提升。避免非通用容器是大规模减少拳击的一种非常有效的方法。能够使用通用容器是从NETFX 1.1迁移到2.0 +的主要好处之一。