聊聊 dotnet 7 对 bool 与字符串互转的底层性能优化

本文探讨了.NET 7对bool和字符串互相转换的性能提升,介绍了一种通过UTF16编码和ASCII规则进行优化的新思路。优化后的代码利用MemoryMarshal.AsBytes和BinaryPrimitives.ReadUInt64LittleEndian等方法,显著提高了转换速度,性能接近.NET 6的三分之一。
摘要由CSDN通过智能技术生成

本文也叫 跟着 Stephen Toub 大佬学性能优化系列。大家都知道在 .NET 7 有众多的性能优化,其中就包括了对布尔和字符串互转的性能优化。在对布尔和字符串的转换的性能优化上,有着非常巧妙的思路,值得写篇博客记录

在 Performance Improvements in .NET 7 - .NET Blog 这篇官方开发博客里面提到了 dotnet 7 的各个方面的性能优化,其中就包括了本身的主角,对 bool 与 string 互转的性能优化。此优化的核心实现代码请参阅 https://github.com/dotnet/runtime/pull/64782

在将 "True" 和 "False" 字符串和 bool 布尔互相转换时,假定不使用框架内置的转换方法,那将会如何做呢?先从字符串转到布尔开始

开始转换的第一步可以通过字符串的长度进行快速的判断。例如无论是 "True" 还是 "False" 字符串,字符的长度都一定是大于 3 的,因此第一步可以尝试判断一下,是否大于 3 个字符。如果这一条不满足,那肯定不能作为布尔的转换字符串了。如果刚好等于 4 个字符长度,那也许就是 "True" 字符串了

转换字符串为布尔时,将无视字符串的大小写,人类方便理解的一个版本如下

internal static bool IsTrueStringIgnoreCase(ReadOnlySpan<char> value)
        {
            return value.Length == 4 &&
                    (value[0] == 't' || value[0] == 'T') &&
                    (value[1] == 'r' || value[1] == 'R') &&
                    (value[2] == 'u' || value[2] == 'U') &&
                    (value[3] == 'e' || value[3] == 'E');
        }

没错,就是每个字符串都判断一下。刚好这就是 dotnet 6 所采用的转换方法。同理,判断 "False" 也是类似的代码逻辑

internal static bool IsFalseStringIgnoreCase(ReadOnlySpan<char> value)
        {
            return value.Length == 5 &&
                    (value[0] == 'f' || value[0] == 'F') &&
                    (value[1] == 'a' || value[1] == 'A') &&
                    (value[2] == 'l' || val
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值