随着 .NET 8 的发布,微软在 .NET Core 和 ASP.NET Core 框架中引入了大量新功能和增强。其中一个显著的功能是 SearchValues 类,它在从数据集中高效获取数据方面迈出了重要一步。SearchValues 是 .NET 8 中引入的一种新类型,旨在提高应用程序性能。通过使用向量化和硬件加速等优化技术,SearchValues 提供了速度增强,同时无缝融合了 .NET Core 和 ASP.NET Core。在本文中,我们将解释如何使用 SearchValues 来提高 .NET Core 应用程序中搜索的速度。
字符串搜索是许多应用程序的基本组成部分。虽然有多种方法可以搜索字符串,但在每种情况下找到最有效的方法可能是一个挑战。例如,虽然可以使用 IndexOfAny()
方法搜索字符串中第一个出现的字符,但对于输入数据不同的后续搜索,这可能不是最佳方法。
考虑以下代码,它演示了如何使用 IndexOfAny()
方法在字符串中执行搜索。
C#string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
char[] c = {'s'};
int indexOfAlpha = str.IndexOfAny(c);
如果接下来想在同一个字符串中搜索多个字符,则需要不同的搜索策略,如下面的代码片段所示。
C#string numeric = "0123456789";
int indexOfAlphaNumeric = str.IndexOfAny(numeric.ToCharArray());
Console.WriteLine(indexOfAlpha);
Console.WriteLine(indexOfAlphaNumeric);
注意,我们将字符串 numeric
转换为字符数组,因为 IndexOfAny()
方法需要一个字符数组作为参数。如果我们想搜索一系列字符,我们必须使用字符串或 char[]
。
SearchValues 使这些不同类型的搜索变得更简单编码且执行速度更快。这是因为 SearchValues 利用了现代 CPU 中的向量处理支持,可以并行处理多个值。
SearchValues 是 .NET 中 System.Buffers 命名空间中的一种新类型,通过向量化和硬件加速来提高搜索效率和性能。SearchValues<T>
类表示一个不可变且只读的值集合。
您可以在任何 ReadOnlySpan<T>
上使用 SearchValues<T>
,这意味着您不仅可以使用它来搜索字符串,还可以搜索集合中的值,甚至是内存块中的值。SearchValues 实例专为在运行时频繁使用相同值集合进行搜索的情况而设计。
C#SearchValues<char> searchValues = SearchValues.Create("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
bool IsAlphanumericContent(ReadOnlySpan<char> text) => text.IndexOfAny(searchValues) != -1 ? true : false;
您可以调用 IsAlphanumericContent()
方法来验证参数是否包含字母数字文本,使用以下代码。
C#Console.WriteLine(IsAlphanumericContent("This is an alphanumeric text for demonstration purposes 0nly."));
注意,SearchValues 类型设计用于搜索集合中某个特定值的第一次出现。
当您在代码中使用 SearchValues 时,运行时会为特定场景确定最佳实现。例如,在以下代码行的情况下,SearchValues 将搜索连续范围的值并为该用例确定最佳实现。
C#SearchValues<char>.Create("12345");
您通过使用 SearchValues 获得的性能提升将取决于您的输入数据以及被搜索的数据的类型和数量。随着数据量的增加,您可以期望获得更显著的性能收益。
C#using System;
using System.Buffers;
using System.Diagnostics;
class Program
{
static void Main()
{
// 创建一个包含2000个字符的字符串,并在最后一个字符设置为'1'
string s = new string('a', 1999) + "1";
// 定义要搜索的字符集
char[] alphaNumeric = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray();
// 使用 IndexOfAny 进行搜索
Stopwatch sw = Stopwatch.StartNew();
int indexOfFirstAlphaNumeric = s.IndexOfAny(alphaNumeric);
sw.Stop();
Console.WriteLine($"IndexOfAny found at: {indexOfFirstAlphaNumeric}, Time taken: {sw.ElapsedTicks} ticks");
// 使用 SearchValues<T> 进行搜索
SearchValues<char> searchValues = SearchValues.Create(alphaNumeric);
sw.Restart();
indexOfFirstAlphaNumeric = s.AsSpan().IndexOfAny(searchValues);
sw.Stop();
Console.WriteLine($"SearchValues found at: {indexOfFirstAlphaNumeric}, Time taken: {sw.ElapsedTicks} ticks");
}
}
在这个例子中,我们创建了一个包含 2000 个字符的字符串,并在最后一个字符设置为 '1'
。然后,我们定义了一个包含字母和数字的字符集,并使用 IndexOfAny
和 SearchValues<T>
分别进行搜索。最后,我们使用 Stopwatch
来测量每种方法的执行时间。
运行这个代码,你会看到 IndexOfAny
和 SearchValues<T>
在找到第一个匹配字符的位置和所花费的时间。请注意,实际的时间可能会因机器和环境的不同而有所不同,但这个例子应该能帮助你理解两者在性能上的差异。
在实时系统中,比如金融交易平台、在线游戏或高频数据处理应用,需要在极短时间内完成大量字符串操作。使用 SearchValues<T>
可以显著降低延迟,提升系统响应速度。
C#string inputData = "TransactionID: 12345, UserID: 67890, Status: OK";
SearchValues<char> searchValues = SearchValues.Create("1234567890");
int index = inputData.AsSpan().IndexOfAny(searchValues);
if (index >= 0)
{
Console.WriteLine("Found numeric character at position: " + index);
}
在大数据分析、自然语言处理或全文搜索引擎中,对大文本数据进行解析和处理时,需要高效的字符串搜索功能来提高整体性能。
C#string largeText = File.ReadAllText("document.txt");
SearchValues<char> searchValues = SearchValues.Create("aeiouAEIOU"); // 查找所有元音字母
int vowelCount = 0;
foreach (char c in largeText)
{
if (searchValues.Span.Contains(c))
{
vowelCount++;
}
}
Console.WriteLine("Total vowels found: " + vowelCount);
在.net 8还不支持SearchValues 的搜索,好像是在.net 9中已经加上了,这样这个功能可用之处大了不少!
SearchValues<T>
提供了一种在字符串搜索中提升性能的方法,特别是在处理大量数据时。虽然它在某些情况下可能不会显著快于默认实现,但在处理大数据集或复杂搜索条件时,它可以带来显著的性能提升。随着 .NET 的不断发展和优化,SearchValues<T>
将成为开发者提升应用性能的一个有力工具。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!