Questions tagged «unboxing»

10
“ as”和可为空的类型带来的性能惊喜
我只是在修改C#中有关可空类型的第4章,并添加了有关使用“ as”运算符的部分,该部分允许您编写: object o = ...; int? x = o as int?; if (x.HasValue) { ... // Use x.Value in here } 我认为这确实很整洁,并且可以使用“ is”后跟强制类型转换来提高C#1等效项的性能-毕竟,这种方式我们只需要进行一次动态类型检查,然后进行简单的值检查。 但是,情况似乎并非如此。我在下面提供了一个示例测试应用程序,该应用程序基本上将对象数组中的所有整数相加-但该数组包含许多空引用和字符串引用以及装箱的整数。该基准测试可测量您在C#1中必须使用的代码,这些代码使用“ as”运算符,并且仅用于启动LINQ解决方案。令我惊讶的是,在这种情况下,C#1代码的速度提高了20倍-甚至LINQ代码(考虑到涉及的迭代器,我希望它也会更慢)击败了“ as”代码。 isinst可为空的类型的.NET实现真的很慢吗?是unbox.any导致问题的其他因素吗?对此还有其他解释吗?目前,感觉就像我将不得不警告不要在性能敏感的情况下使用此功能... 结果: 演员:10000000:121 身份:10000000:2211 LINQ:10000000:2143 码: using System; using System.Diagnostics; using System.Linq; class Test { const int Size = 30000000; static void Main() …


2
Java 6与Java 7在自动拆箱中的差异
我已经注意到Java SE 6和Java SE 7在自动拆箱行为上的差异。我想知道为什么会这样,因为我找不到这两个版本之间这种行为变化的任何文档。 这是一个简单的例子: Object[] objs = new Object[2]; objs[0] = new Integer(5); int myInt = (int)objs[0]; 使用Java SE 7中的javac可以很好地进行编译。但是,如果我给编译器提供“ -source 1.6”参数,则在最后一行会出现错误: inconvertible types found : java.lang.Object required: int 我尝试下载Java SE 6以使用本机版本6编译器进行编译(没有任何-source选项)。它同意并给出与上述相同的错误。 那有什么呢?从更多的实验来看,Java 6中的拆箱似乎只能拆装明显(在编译时)属于装箱类型的值。例如,这在两个版本中都适用: Integer[] objs = new Integer[2]; objs[0] = new Integer(5); int myInt = (int)objs[0]; 因此,似乎在Java …
107 java  casting  java-7  unboxing 


6
用泛型装箱和拆箱
创建整数集合的.NET 1.0方法(例如)是: ArrayList list = new ArrayList(); list.Add(i); /* boxing */ int j = (int)list[0]; /* unboxing */ 使用此方法的代价是由于装箱和拆箱而导致缺乏类型安全性和性能。 .NET 2.0方法是使用泛型: List<int> list = new List<int>(); list.Add(i); int j = list[0]; 装箱的价格(据我了解)是需要在堆上创建一个对象,将分配给堆栈的整数复制到新对象,反之亦然。 泛型的使用如何克服这个问题?堆栈分配的整数是否保留在堆栈上并从堆中指向(我想不是这样,因为当超出范围时会发生什么)?似乎仍然需要将其复制到堆栈中的其他位置。 到底是怎么回事?
67 c#  .net  generics  boxing  unboxing 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.