Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CLR中的装箱和拆箱操作(如果有)有哪些性能改进?_C#_.net_Clr_Boxing_Unboxing - Fatal编程技术网

C# CLR中的装箱和拆箱操作(如果有)有哪些性能改进?

C# CLR中的装箱和拆箱操作(如果有)有哪些性能改进?,c#,.net,clr,boxing,unboxing,C#,.net,Clr,Boxing,Unboxing,几个月前我参加了一个研讨会,演讲者说自从.NET1.1以来,装箱或拆箱操作的一般成本已经降低了。我已经浏览了我的(糟糕的)笔记,无法确定此语句是否引用了box和unbox指令,或者引用了使装箱/取消装箱不太可能发生的类(即泛型类型) 在.NET 1.1和.NET 4.0之间的CLR装箱相关指令中是否有性能改进,如果有,我在哪里可以找到显示改进的度量的信息?我无法对性能发表评论(因为您需要评测等)-但这里有一个有趣的变化是操作代码,特别是泛型。这里的优点是,对于以下方法: static void

几个月前我参加了一个研讨会,演讲者说自从.NET1.1以来,装箱或拆箱操作的一般成本已经降低了。我已经浏览了我的(糟糕的)笔记,无法确定此语句是否引用了box和unbox指令,或者引用了使装箱/取消装箱不太可能发生的类(即泛型类型)


在.NET 1.1和.NET 4.0之间的CLR装箱相关指令中是否有性能改进,如果有,我在哪里可以找到显示改进的度量的信息?

我无法对性能发表评论(因为您需要评测等)-但这里有一个有趣的变化是操作代码,特别是泛型。这里的优点是,对于以下方法:

static void DoSomething<T>(T x, T y) where T : IComparable<T>
{
    if(x.CompareTo(y) < 0) { /* whatever */ }
}
static void DoSomething(tx,ty),其中T:i可比较
{
如果(x.CompareTo(y)<0{/*无论什么*/}
}

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

应尽可能避免装箱和取消装箱。发件人:

最好避免在必须多次装箱的情况下使用值类型,例如在System.collections::ArrayList等非泛型集合类中。通过使用诸如System.collections.generic::List之类的泛型集合,可以避免值类型的装箱。装箱和拆箱是计算成本很高的过程。当值类型被装箱时,必须创建一个全新的对象。这可能比一个简单的参考分配要长20倍。拆箱时,铸造过程可能需要四倍于分配的时间

微软已经尽其所能将拳击手术的成本降到最低,但所能做的只有这么多


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

恰恰相反,un/boxing在.NET 1.0中得到了高度优化。添加了Nullable和泛型,这使得拆箱更加复杂,需要CLR助手方法。它大大减少了使用泛型的盒子的数量,这使得所有的差异都变得显著。如果给定一个泛型类型参数,该参数可能实现或可能不实现某些接口(例如IDisposable),是否有类似的方法?至少在vb.net中,我能想到的对泛型类型参数有条件地使用接口函数的唯一方法是将其强制转换为对象,然后尝试将其强制转换为接口,但无论对接口的强制转换是否有效,最终都会装箱项。讨厌。@supercat不,在这一点上,您必须将
作为接口的
,因此boxI不知道有什么办法可以绕过它,但想知道是否有。我想知道CLR是否可以支持这样一个“if constraint”构造:如果泛型类型满足某个约束,那么运行一些需要它满足该约束的代码。由于将为其中使用的每个泛型值类型组合编译一个泛型例程的单独副本,因此理论上似乎是可能的。否则,是否可以编写类似于“Comparer.Default”的东西而不进行反射?