首页 >后端开发 >C++ >为什么 C# 的'as”运算符在此可空整数求和测试中比传统转换慢?

为什么 C# 的'as”运算符在此可空整数求和测试中比传统转换慢?

Linda Hamilton
Linda Hamilton原创
2025-01-07 09:11:40219浏览

Why is C#'s

“as”和可空类型的性能惊喜

背景

“as” C# 中的运算符允许动态类型检查和安全转换。与传统的“is”运算符后跟强制转换相比,这可能会提高性能。然而,在最近的测试用例中观察到了意外的性能结果。

测试应用程序和结果

开发了一个测试应用程序来对包含空引用的对象数组中的整数进行求和、字符串引用和装箱整数。该应用程序使用了三种方法:“Cast”(C# 1 等效项)、“As”(使用“as”运算符)和“LINQ”(使用 OfType() 扩展方法)。令人惊讶的是,“Cast”方法明显快于“As”方法,而“As”方法又比“LINQ”方法稍慢。

分析

JIT 编译器可以为“Cast”方法生成高效的代码,因为它利用内存中值转换。对象只能拆箱为与装箱值类型相同的变量,这简化了转换过程。

“As”方法需要转换为 Nullable;因为装箱整数的值表示与 Nullable 的内存布局不兼容。这是通过辅助函数 JIT_Unbox_Nullable 完成的,它会带来额外的开销。

“LINQ”方法采用“is”运算符并通过辅助函数 JIT_Unbox() 进行通用转换。虽然它的性能比“As”方法稍好,但由于 ngen.exe 优化,它仍然较慢。

结论

“as”运算符可能并不总是与“Cast”方法相比,可提供性能优势,尤其是在性能敏感的情况下。虽然“LINQ”方法是一种可行的替代方案,但它也可能会遇到性能限制。因此,在选择最佳方法之前,考虑具体情况并权衡利弊非常重要。

以上是为什么 C# 的'as”运算符在此可空整数求和测试中比传统转换慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn