“as”和可空类型的性能惊喜
背景
“as” C# 中的运算符允许动态类型检查和安全转换。与传统的“is”运算符后跟强制转换相比,这可能会提高性能。然而,在最近的测试用例中观察到了意外的性能结果。
测试应用程序和结果
开发了一个测试应用程序来对包含空引用的对象数组中的整数进行求和、字符串引用和装箱整数。该应用程序使用了三种方法:“Cast”(C# 1 等效项)、“As”(使用“as”运算符)和“LINQ”(使用 OfType() 扩展方法)。令人惊讶的是,“Cast”方法明显快于“As”方法,而“As”方法又比“LINQ”方法稍慢。
分析
JIT 编译器可以为“Cast”方法生成高效的代码,因为它利用内存中值转换。对象只能拆箱为与装箱值类型相同的变量,这简化了转换过程。
“As”方法需要转换为 Nullable
“LINQ”方法采用“is”运算符并通过辅助函数 JIT_Unbox() 进行通用转换。虽然它的性能比“As”方法稍好,但由于 ngen.exe 优化,它仍然较慢。
结论
“as”运算符可能并不总是与“Cast”方法相比,可提供性能优势,尤其是在性能敏感的情况下。虽然“LINQ”方法是一种可行的替代方案,但它也可能会遇到性能限制。因此,在选择最佳方法之前,考虑具体情况并权衡利弊非常重要。
以上是为什么 C# 的'as”运算符在此可空整数求和测试中比传统转换慢?的详细内容。更多信息请关注PHP中文网其他相关文章!