Применил технику оптимизации из
A6 для ускорения обычного линейного поиска.
Ускорилось на
11%.
Эталонный алгоритм:
static long
L1 (char* begin)
{
char* p = begin;
while (*p != 0)
{
p++;
}
return (long)(p - begin);
}
Ускоренный алгоритм:
static long
L2 (char* begin)
{
char* p = begin;
while (*p != 0)
{
if (*(p + 1) == 0)
{
p++;
}
else if (*(p + 2) == 0)
{
p += 2;
}
else
{
p += 3;
}
}
return (long)(p - begin);
}
Прогнал сто раз по массиву из миллиарда букв:
L1 27.9264553 секунд
L2 24.9913335 секунд
Добавление более двух веток if-else результата не изменило. Использование всего одной ветки if-else результат только ухудшило.
Для маленьких массивов целиком убирающихся в кэш процессора ускорение составило всего 1%.
Win 7 64bit, .Net 4.0, i7 3770K.