首页 >后端开发 >C++ >为什么 C#'as”运算符比可空类型的'is”慢?

为什么 C#'as”运算符比可空类型的'is”慢?

DDD
DDD原创
2025-01-07 09:22:45546浏览

Why is the C#

C# 中“as”运算符和可空类型的意外性能差异

C# 中的“as”运算符提供了一种便捷的执行方式动态类型检查和强制转换。虽然看起来,使用可空类型的“as”会比传统的“is”运算符和转换提供性能改进,但最近的测试揭示了令人惊讶的结果。

在对象数组包含混合的测试场景中对于整数、字符串和空引用,“as”运算符的性能明显低于“is”运算符。这是出乎意料的,因为人们会认为“as”运算符的类型检查和值检查的组合比两次查询动态类型更有效。

分析可空类型的“isinst”的 .NET 实现揭示了这一点它不是特别慢。相反,问题似乎源于在可空类型中使用“as”时所需的额外拆箱步骤。

JIT 编译器可以为“is”运算符生成高度优化的代码,并为不可空类型进行强制转换。然而,具有可空类型的“as”需要更复杂的 JIT 辅助函数来执行拆箱并转换为 Nullable。此函数的开销比“is”运算符中使用的直接类型检查和强制转换更高。

使用“OfType()”和强制转换为泛型类型的 LINQ 解决方案的性能也比“是”运算符。这可能归因于 JIT 辅助函数 JIT_Unbox(),该函数在转换为 Nullable 期间被调用。

总之,虽然“as”运算符提供了方便的语法,但它可能并不总是在使用可空类型时提供最佳性能。在性能关键的场景中,建议使用“is”运算符并直接转换为所需的类型。

以上是为什么 C#'as”运算符比可空类型的'is”慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

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