.NET 1.1和.NET 4.0之间的CLR拳击相关指令是否有性能改进,如果是这样,我在哪里可以找到有关显示收益的测量信息?
答案 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:
MS已经尽其所能来最大限度地降低拳击作战本身的成本,但是只能做到这一点。最好避免在必须装箱次数很多的情况下使用值类型,例如在非泛型集合类(如System.Collections :: ArrayList)中。您可以使用泛型集合(如System.Collections.Generic :: List)来避免对值类型进行装箱。拳击和拆箱是计算上昂贵的过程。装箱值类型时,必须创建一个全新的对象。这可能比简单的参考分配长20倍。拆箱时,铸造过程可能需要四倍的分配。
通过从一个代码中消除尽可能多的装箱,可以实现更好的性能提升。避免非通用容器是大规模减少拳击的一种非常有效的方法。能够使用通用容器是从NETFX 1.1迁移到2.0 +的主要好处之一。