# Как ускорить C# String.Indexof в поиске заранее известной строки в один проход при заранее неизвестном её расположении

Алексей Сергеевич Лот

Использован .Net Core 3.0. На данный момент хранения строк в памяти в сжатом виде замечено не было, как и распараллеливания IndexOf производителем. Программа, делающая замер:


using System; using System.Diagnostics; namespace probe { class Program { static void Main() { //подготавливаем строку string str = string.Empty; int i; for(i = 0; i < 10000; i ++) str += 'o'; for(i = 0; i < 10; i ++) str += str; str += "<tag>"; Stopwatch sw = new Stopwatch(); sw.Reset(); int index; //берём пробу с IndexOf sw.Start(); index = str.IndexOf("<tag>"); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds + " " + index); //берём пробу с ручным проходом sw.Restart(); int len = str.Length - 4; for(i = 0; i < len; i ++) { if (str[i] == '<' && str[i+1] == 't' && str[i+2] == 'a' && str[i+3] == 'g' && str[i+4] == '>') { index = i; break; } } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds + " " + index); } } }


На двухъядерном процессоре Intel результат такой:


639 10240000 76 10240000


Если на том же компьютере с Windows 10 в цикле генерации строки я заменяю 'o' на "<tag" с сохранением остального кода, то результаты различаются в 20 раз.