本文也叫 跟着 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