Я использовал источник на этой странице в качестве примера, затем дублировал содержимое 8 раз, в результате чего страница длиной около 334 312 байт.Использование StringComparision.Ordinal приводит к огромной разнице в производительности.
string newInput = string.Format("{0}{0}{0}{0}{0}{0}{0}{0}", input.Trim().ToLower());
//string newInput = input.Trim().ToLower();
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int[] _exclStart = new int[100];
int[] _exclStop = new int[100];
int _excl = 0;
for (int f = newInput.IndexOf("<script", 0, StringComparison.Ordinal); f != -1; )
{
_exclStart[_excl] = f;
f = newInput.IndexOf("</script", f + 8, StringComparison.Ordinal);
if (f == -1)
{
_exclStop[_excl] = newInput.Length;
break;
}
_exclStop[_excl] = f;
f = newInput.IndexOf("<script", f + 8, StringComparison.Ordinal);
++_excl;
}
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
при выполнении 5 раз дает почти одинаковый результат для каждого (время цикла существенно не изменилось, поэтому для этого простого кода JIT почти не тратит время наскомпилируйте его)
Вывод с использованием исходного кода (в Миллисекунды ):
10.2786
11.4671
11.1066
10.6537
10.0723
Вывод с использованием вышеуказанного кода (в Миллисекундах ):
0.3055
0.2953
0.2972
0.3112
0.3347
Обратите внимание, что результаты моего теста составляют около 0,010 секунд (исходный код) и 0,0003 секунд (для порядкового кода).Это означает, что у вас есть что-то не так, кроме этого кода напрямую.
Если, как вы говорите, использование StringComparison.Ordinal
ничего не делает для вашей производительности, то это означает, что вы используете неправильные таймеры для измерения времени вашей работы, или у вас естьбольшие издержки при чтении значения input
, например при повторном чтении из потока, который вы иначе не осознаете.
Протестировано в Windows 7 x64, работающей на i5 3GHz с использованием .NET 4 Client Profile.
Предложения:
- использование
StringComparison.Ordinal
- Убедитесь, что вы используете
System.Diagnostics.Stopwatch
для измерения производительности - Объявите локальную переменную для
input
вместо использования значений, внешних по отношению к функции (например: string newInput = input.Trim().ToLower();
)
Еще раз подчеркиваю, я получаю 50 раз быстрее скорость для тестовых данных, которые, по-видимому,более чем в 4 раза больше по размеру, используя тот же код, который вы предоставляете.Это значит, что мой тест выполняется примерно в 1044 * 200 раз быстрее , чем у вас, и это совсем не то, чего можно было бы ожидать, если бы мы оба работали в одной среде, и только i5 (я) против i7 (вы).