如何高性能零内存分配函数为?
摘要:继上一篇文章在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)分享了四种LikeString的实现方式,笔者对这四种实现方式,不管是执行性能还是内存分配性能上,都不太满意。 那么是否有
继上一篇文章在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)分享了四种LikeString的实现方式,笔者对这四种实现方式,不管是执行性能还是内存分配性能上,都不太满意。
那么是否有好的实现方法呢?答案是有的。
今天我们就搬出ReadOnlySpan<T>这个非常好用的结构类型,它是在 .NET Core 2.1 中新引入的类型,与它一同被引入的类型还有:
System.Span: 这以类型安全和内存安全的方式表示任意内存的连续部分;
System.ReadOnlySpan: 这表示任意连续内存区域的类型安全和内存安全只读表示形式;
System.Memory: 这表示一个连续的内存区域;
System.ReadOnlyMemory: 类似ReadOnlySpan, 此类型表示内存的连续部分ReadOnlySpan, 它不是 ByRef 类型;
注:ByRef 类型指的是 ref readonly struct。
下面,我们就来看看如何实现高性能和零内存分配的 LikeString 函数吧!
#nullable enable
using System;
namespace AllenCai
{
/// <summary>
/// 这是一个模仿Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString方法,<br />
/// 实现支持*和?通配符和支持忽略大小写规则以及区域无关性的匹配。<br />
/// 该实现的目的是为了减少内存分配,提高性能。
/// </summary>
public class ZeroMemAllocLikeOperator
{
/// <summary>
/// 对给定的两个字符串执行比较,支持使用*和?通配符。
/// </summary>
public static bool LikeString(string? content, string? pattern, bool ignoreCase = true, bool useInvariantCulture = true)
{
if (content == null && pattern == null)
return true;
if (content == null || pattern == null)
return false;
ReadOnlySpan<char> patternSpan = pattern.AsSpan();
ReadOnlySpan<char> contentSpan = content.AsSpan();
return LikeString(contentSpan, patternSpan, ignoreCase, useInvariantCulture);
}
/// <summary>
/// 对给定的两个字符Span执行比较,支持使用*和?通配符。
/// </summary>
public static bool LikeString(ReadOnlySpan<char> contentSpan, ReadOnlySpan<char> patternSpan, bool ignoreCase = true, bool useInvariantCulture = true)
{
char zeroOrMoreChars = '*';
char oneChar = '?';
// 如果pattern是由1个星号*组成,那么没必要匹配,直接返回true。
