У меня очень длинная строка (60 МБ), в которой мне нужно найти, сколько пар '<' и ' > ' находятся там.
Я сначала попытался по-своему:
char pre = '!';
int match1 = 0;
for (int j = 0; j < html.Length; j++)
{
char c = html[j];
if (pre == '<' && c == '>') //find a match
{
pre = '!';
match1++;
}
else if (pre == '!' && c == '<')
pre = '<';
}
Приведенный выше код работает на моей строке примерно на 1000 мс.
Затем я попытался использовать string.IndexOf
int match2 = 0;
int index = -1;
do
{
index = html.IndexOf('<', index + 1);
if (index != -1) // find a match
{
index = html.IndexOf('>', index + 1);
if (index != -1)
match2++;
}
} while (index != -1);
Вышеприведенный код работает только около 150 мс.
Мне интересно, что такое магия, которая заставляет string.IndexOf
запускать так быстро?
Кто-нибудь может вдохновить меня?
Edit
Хорошо, в соответствии с ответом @BrokenGlass. Я изменил свой код так, чтобы они не проверяли сопряжение, вместо этого они проверяют, сколько '<' в строке.
for (int j = 0; j < html.Length; j++)
{
char c = html[j];
if (c == '>')
{
match1++;
}
}
приведенный выше код работает примерно 760 мс.
Используя IndexOf
int index = -1;
do
{
index = html.IndexOf('<', index + 1);
if (index != -1)
{
match2++;
}
} while (index != -1);
Приведенный выше код работает примерно 132 мс. все еще очень быстро.
Изменить 2
После прочтения комментария @Jeffrey Sax, я понял, что я работал в VS с режимом Debug.
Затем я построил и запустил в режиме выпуска, ok, IndexOf
все еще быстрее, но не так быстрее.
Вот результаты:
Для количества спаривания: 207ms VS 144ms
Для обычного char count: 141ms VS 111ms.
Эффективность моих собственных кодов была действительно улучшена.
Извлеченный урок: когда вы делаете тест, делайте это в режиме выпуска!