Start Debugging

Desempenho no .NET 10: SearchValues

Use SearchValues no .NET 10 para busca multi-string de alto desempenho. Substitui loops foreach por correspondência acelerada por SIMD usando os algoritmos Aho-Corasick e Teddy.

No .NET 8, a Microsoft introduziu SearchValues<T>, um tipo especializado que otimizava a busca de um conjunto de valores (como bytes ou chars) dentro de um span. Ele vetorizava a busca, tornando-a significativamente mais rápida que IndexOfAny.

No .NET 10, esse poder foi estendido para strings. SearchValues<string> permite buscar várias substrings simultaneamente com desempenho impressionante.

O caso de uso: parsing e filtragem

Imagine que você está escrevendo um parser ou um sanitizador que precisa verificar se um texto contém alguma palavra ou token de uma lista específica de proibidos.

A forma antiga (lenta)

private static readonly string[] Forbidden = { "drop", "delete", "truncate" };

public bool ContainsSqlInjection(ReadOnlySpan<char> input)
{
    foreach (var word in Forbidden)
    {
        if (input.Contains(word, StringComparison.OrdinalIgnoreCase))
            return true;
    }
    return false;
}

Isso é O(N * M), onde N é o comprimento da entrada e M é o número de palavras. Ele varre a string repetidamente.

A forma nova: SearchValues

Com o .NET 10, você pode pré-computar a estratégia de busca.

using System.Buffers;

// 1. Create the optimized searcher (do this once, statically)
private static readonly SearchValues<string> SqlTokens = 
    SearchValues.Create(["drop", "delete", "truncate"], StringComparison.OrdinalIgnoreCase);

public bool ContainsSqlInjection(ReadOnlySpan<char> input)
{
    // 2. Search for ANY of them in one pass
    return input.ContainsAny(SqlTokens);
}

Impacto no desempenho

Por baixo dos panos, SearchValues.Create analisa os padrões.

Para um conjunto de 10 a 20 palavras-chave, SearchValues pode ser 50 vezes mais rápido que um loop ou uma Regex.

Encontrando a posição

Você não está limitado a uma verificação booleana. Você pode encontrar onde a correspondência ocorreu:

int index = input.IndexOfAny(SqlTokens);
if (index >= 0)
{
    Console.WriteLine($"Found distinct token at index {index}");
}

Resumo

SearchValues<string> no .NET 10 traz busca de texto de alto desempenho para todos sem exigir bibliotecas externas. Se você está fazendo qualquer tipo de processamento de texto, análise de log ou filtragem de segurança, substitua seus loops foreach por SearchValues imediatamente.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar