首页 >后端开发 >C++ >对于 C# 中的可空类型,'as”运算符是否始终比'is”提供性能优势?

对于 C# 中的可空类型,'as”运算符是否始终比'is”提供性能优势?

Patricia Arquette
Patricia Arquette原创
2025-01-07 09:31:40240浏览

Does the

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

《C# 深度》第 4 章中,正在讨论可空类型和“as”运算符。具体来说,期望使用“as”进行类型检查可以比传统的“is”检查和转换提高性能,因为它将流程简化为单一类型检查和值检查。然而,我们观察到了令人惊讶的结果。

性能基准测试

为了评估性能,进行了基准测试,其中涉及对包含大量空引用和字符串引用的对象数组中的整数进行求和。该测试测量了以下代码片段的执行时间:

  • 使用“is”和转换的 C# 1 风格代码
  • 使用“as”运算符
  • LINQ解决方案

令研究人员惊讶的是,C# 1 代码的性能明显优于“as”代码和 LINQ 代码。

结果分析

性能差异归因于以下原因因素:

JIT 编译器对“is”和强制转换的优化:
“is”运算符测试和后续强制转换可以通过 JIT 编译器进行优化,从而获得高效的机器以最少的指令执行的代码。这种优化是可能的,因为装箱值类型可以直接拆箱为相同类型的变量,无需任何值转换或复制。

转换为 Nullable 的复杂性:
转换为 int?使用“as”需要更复杂的转换过程,因为装箱整数的值表示与 Nullable 的内存布局不同。这需要使用名为 JIT_Unbox_Nullable 的通用拆箱辅助函数,该函数由于其通用性质和类型检查而引入了额外的开销。

LINQ 的意外行为:
OfType LINQ 中的 () 扩展方法还利用“is”运算符和 JIT_Unbox() 辅助函数。然而,它的性能与 Nullable 的“as”转换相当,尽管预期它应该更便宜。这种差异可能归因于 ngen.exe 引起的潜在问题。

结论

虽然“as”运算符提供了一种便捷的方法来执行类型检查和可空值处理,但其性能特征在具体场景可能并不总是如预期的那样。在涉及大量拆箱操作的情况下,C# 1 中为“is”和转换生成的优化代码仍然明显更快,这凸显了在选择编码技术时考虑性能影响的重要性。

以上是对于 C# 中的可空类型,'as”运算符是否始终比'is”提供性能优势?的详细内容。更多信息请关注PHP中文网其他相关文章!

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