Com o lançamento do .NET 8, a Microsoft introduziu uma infinidade de novos recursos e aprimoramentos nas estruturas .NET Core e ASP.NET Core. Um desses recursos é a classe SearchValues, que marca um avanço significativo na busca eficiente de dados de conjuntos de dados.
SearchValues é um novo tipo introduzido no .NET 8 projetado para melhorar o desempenho do aplicativo. Ao usar técnicas de otimização como vetorização e aceleração de hardware, SearchValues oferece melhorias de velocidade ao mesmo tempo em que combina perfeitamente com .NET Core e ASP.NET Core.
Neste artigo, explicaremos como você pode usar SearchValues para melhorar a velocidade das pesquisas em aplicativos .NET Core.
Crie um projeto de aplicativo de console no Visual Studio
Primeiro, vamos criar um projeto de aplicativo de console .NET Core no Visual Studio. Supondo que o Visual Studio 2022 esteja instalado em seu sistema, siga as etapas descritas abaixo para criar um novo projeto de aplicativo de console .NET Core.
- Inicie o IDE do Visual Studio.
- Clique em “Criar novo projeto”.
- Na janela “Criar novo projeto”, selecione “Aplicativo de console (.NET Core)” na lista de modelos exibida.
- Clique em Avançar.
- Na janela “Configure seu novo projeto”, especifique o nome e o local do novo projeto.
- Clique em Avançar.
- Na janela “Informações adicionais” mostrada a seguir, escolha “.NET 8.0 (Long Term Support)” como a versão do framework que você gostaria de usar.
- Clique em Criar.
Usaremos esse projeto de aplicativo de console .NET 8 para trabalhar com os exemplos de código mostrados nas seções subsequentes deste artigo.
Dicas de desempenho de pesquisa de strings
As pesquisas de strings são uma parte fundamental de muitas aplicações. Embora existam diversas maneiras de pesquisar strings, encontrar o método mais eficiente em cada caso pode ser um desafio. Por exemplo, embora você possa usar o método IndexOfAny() para procurar a primeira ocorrência de um caractere em uma string, ele pode não ser o método ideal para pesquisas subsequentes onde os dados de entrada são diferentes.
Considere o código a seguir que ilustra como você pode realizar uma pesquisa em uma string usando o método IndexOfAny().
string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; char() c = {'s'}; int indexOfAlpha = str.IndexOfAny(c);
Se em seguida quiser pesquisar mais de um caractere na mesma string, você precisará de uma estratégia de pesquisa diferente, conforme mostrado no trecho de código fornecido abaixo.
string numeric = "0123456789"; int indexOfAlphaNumeric = str.IndexOfAny(numeric.ToCharArray()); Console.WriteLine(indexOfAlpha); Console.WriteLine(indexOfAlphaNumeric);
Observe que convertemos a string numérica em uma matriz de caracteres porque o método IndexOfAny() requer uma matriz de caracteres como parâmetro. Se quisermos pesquisar um intervalo de caracteres, devemos usar uma string ou char().
SearchValues torna esses diferentes tipos de pesquisas mais simples de codificar e mais rápidos de executar. Isso ocorre porque SearchValues aproveita o suporte ao processamento vetorial nas CPUs atuais, que podem processar vários valores em paralelo.
O que é SearchValues?
SearchValues é um novo tipo no namespace System.Buffers no .NET que emprega vetorização e aceleração de hardware para melhorar a eficiência e o desempenho da pesquisa. A classe SearchValues
Você pode usar SearchValues
Considere o seguinte código.
SearchValues<char> searchValues = SearchValues.Create("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); bool IsAlphanumericContent(ReadOnlySpan<char> text) => text.IndexOfAny(searchValues) != -1 ? true:false;
Você pode invocar o método IsAlphanumericContent() para verificar se o parâmetro contém texto alfanumérico usando o código a seguir.
Console.WriteLine(IsAlphanumericContent("This is an alphanumeric text for demonstration purposes 0nly."));
Observe que o tipo SearchValues foi projetado para pesquisar a primeira ocorrência de um valor específico dentro de uma coleção.
Ao usar SearchValues em seu código, o tempo de execução determina uma implementação ideal para o cenário específico. Por exemplo, no caso da linha de código a seguir, SearchValues procurará um intervalo contíguo de valores e determinará uma implementação ideal para esse caso de uso.
SearchValues<char>.Create("12345");
Os ganhos de desempenho que você obtém com SearchValues dependerão dos dados de entrada e do tipo e volume dos dados que estão sendo pesquisados. Você pode esperar benefícios de desempenho mais significativos à medida que o volume de dados aumenta.
Comparando o desempenho da pesquisa no .NET
O código a seguir mostra como você pode executar testes de benchmark para comparar o desempenho do método IndexOfAny usando uma matriz de caracteres versus SearchValues.
(MemoryDiagnoser) public class PerformanceBenchmark { private char() charValues = { 's', 'a', 'm', 'p', 'l', 'e' }; private SearchValues<char> searchValues = SearchValues.Create("sample"); private string text = "this text is in lower case for testing purposes only"; (Benchmark) public int IndexOfCharBenchmark() { return text.AsSpan().IndexOfAny(charValues); } (Benchmark) public int IndexOfSearchValuesBenchmark() { return text.AsSpan().IndexOfAny(searchValues); } }
Para executar os testes de benchmark acima, você deve especificar o seguinte código em seu Program.cs.
using BenchmarkDotNet.Running; using SearchValuesDemo; var summary = BenchmarkRunner.Run<PerformanceBenchmark>();
A Figura 1 mostra as diferenças de desempenho dessas duas abordagens quando você executa os benchmarks na janela do console.
Como você pode ver nos dados de benchmark, há um ganho considerável de desempenho quando você usa SearchValues.
A introdução de SearchValues no .NET 8 marca uma mudança de paradigma na eficiência da busca de valores em uma coleção de dados. System.Buffers.SearchValues