CLR中的装箱和拆箱操作进行了哪些性能改进(如果有的话)

本文关键字:性能 如果 操作 CLR | 更新日期: 2023-09-27 18:11:08

几个月前我参加了一个研讨会,演讲者说,自。net 1.1以来,装箱或拆箱操作的总成本已经减少了。我看了我的(可怜的)笔记,不能确定这个语句是否引用了box和unbox指令,或者引入了使装箱/拆箱不太可能发生的类(即泛型类型)。

在。net 1.1和。net 4.0之间,与CLR装箱相关的指令是否有性能改进,如果有,我在哪里可以找到显示增益的测量信息?

CLR中的装箱和拆箱操作进行了哪些性能改进(如果有的话)

我不能评论性能(因为你需要分析,等等)-但这里有一个有趣的变化是约束的操作代码,它用于特别是泛型。这里的优点是,对于像

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

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

应尽量避免装箱和拆箱。从MSDN:

最好避免在必须大量装箱的情况下使用值类型,例如在System.Collections::ArrayList等非泛型集合类中。你可以通过使用泛型集合来避免值类型的装箱,比如System.Collections.Generic::List。装箱和拆箱是计算成本很高的过程。当值类型被装箱时,必须创建一个全新的对象。这可能比简单的引用赋值多花20倍的时间。在拆箱时,强制转换过程的时间可能是赋值的四倍。

MS已经尽其所能将装箱操作本身的成本降至最低,但能做的只有这么多。

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