Tag: 空置拆箱

性能惊喜与“为”和可为空的types

我只是修改了C#深入处理可空types的第4章,我添加了一个关于使用“as”运算符的部分,它允许您编写: object o = …; int? x = o as int?; if (x.HasValue) { … // Use x.Value in here } 我认为这是非常简洁的,它可以提高C#1的性能,使用“is”后跟一个cast – 毕竟,这样我们只需要dynamictypes检查一次,然后进行简单的值检查。 但是,这似乎并非如此。 我已经在下面包含了一个示例testing应用程序,它基本上总结了一个对象数组中的所有整数 – 但是数组包含了大量的空引用和string引用以及盒装整数。 该基准测量了您在C#1中使用的代码,使用“as”运算符的代码,以及用于踢LINQ解决scheme的代码。 令我惊讶的是,在这种情况下,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; […]