Почему длина ввода в регулярном выражении не влияет на производительность и как это возможно?Почему regex не заботится о длине строки
Сгенерированная строка такова: 128 случайных символов. затем два числа в скобках. и это повторяется много раз.
128 radnom characters....(-2435346|45436) 128 radnom characters....(-32525562|-325346)
Регулярное выражение получает все числа внутри скобок. вот шаблон.
\(([-+]?\d+\|[-+]?\d+)\)
Так матчи будет как
-2435346|45436
-32525562|-325346
etc...
Вот код, который делает тест. Я запускаю секундомер после ввода, потому что я хочу только оценить время согласования.
Random rand = new Random();
Func<string> getRandString = // generates 128 random characters.
() => Enumerable.Range(0, 128).Select(x => (char) rand.Next()).Aggregate("", (a, b) => a + b);
Func<int> getRandInteger =() => rand.Next(); // generates random number.
string format = "{0}({1}|{2})";
// Generate the big string.
StringBuilder bigstr = new StringBuilder();
for (int i = 0; i < 100; i++) // repeat 100 times.
{
bigstr.Append(string.Format(format, getRandString(), getRandInteger(), getRandInteger()));
}
string input = bigstr.ToString();
Stopwatch stopwatch = Stopwatch.StartNew();
var matches = Regex.Matches(input, @"\(([-+]?\d+\|[-+]?\d+)\)");
stopwatch.Stop();
Console.WriteLine("Time Elapsed :\t{0}\nInputLength :\t{1}\nMatches Count :\t{2}", stopwatch.Elapsed, input.Length, matches.Count);
Это выход в моей консоли, если я повторить петлю 10
раз.
Time Elapsed : 00:00:00.0004132
InputLength : 1500
Matches Count : 10
Если я повторяю цикл 1000
раз.
Time Elapsed : 00:00:00.0004373 // seriously?
InputLength : 149937
Matches Count : 1000
Если я повторяю цикл 1000000
раз.
Time Elapsed : 00:00:00.0004900 // wtf?
InputLength : 149964452
Matches Count : 1000000
Скриншот если вы не верите
Является ли это какое-то ленивые оценки? если да, то как это может показать количество матчей? как всегда я делал это под отладчиком, и я мог видеть матчи.
Есть ли что-то особенное в моем шаблоне регулярных выражений, что делает его быстрым? но как длина строки не влияет на производительность? Я не могу понять.
Здесь нет ничего особенного. Ваш regex движок будет перемещать строку и сохранять все состояния, которые соответствуют вашему регулярному выражению, и вы являетесь эталоном в 1000-кратной более длинной строке, которая не является большой проблемой на данный момент. гораздо более крупные строки.Или, может быть, ваш скамьярикон несправедлив. – Kasramvd
Возможно, вас заинтересует [этот мой ответ] (http://stackoverflow.com/a/32618592/3764814), если вы хотите увидеть некоторые подробности о строчном алгоритме поиска, используемом движком .NET regex. –
Правильный бенчмаркинг: https://andreyakinshin.gitbooks.io/performancebookdotnet/content/science/microbenchmarking.html –