Продолжаем знакомиться с возможностями современного .NET.
Метод IndexOfAny существовал и раньше. Новая идея здесь — SearchValues<T>.
Он позволяет один раз подготовить и оптимизировать набор значений, а затем использовать его во множестве поисков.
uses System.Buffers;
begin
var chars := SearchValues.Create(
'abcdefghijklmnopqrstuvwxyz0123456789'.ToCharArray
);
var texts := [
'***PascalABC.NET',
'---compiler',
'...12345',
'___algorithm'
];
foreach var text in texts do
begin
var p := text.AsSpan.IndexOfAny(chars);
Println(text,p);
end;
end.
Здесь набор букв и цифр создаётся только один раз:
var chars := SearchValues.Create(...);
А затем тот же SearchValues используется для поиска в разных строках.
Внутри .NET может выбрать для такого набора специальное представление и использовать оптимизированные алгоритмы, включая SIMD-векторизацию.
Поэтому SearchValues особенно полезен, когда:
• один и тот же набор символов используется много раз;
• набор достаточно большой;
• нужно быстро обрабатывать большие объёмы текста.
Например, при разборе текста, лексическом анализе, поиске разделителей, проверке допустимых символов и обработке протоколов.
Идея простая:
обычный IndexOfAny — нашли один раз;
SearchValues — один раз подготовили набор → много раз быстро ищем.