Сергей, есть возможность мой говнокод прогнать тоже? 
Я затрудняюсь адекватно перевести его на ансэйфный C# в варианте без заранее известной длины массива (чтобы адекватно сравнить с предыдущими). В результате творческого пересказа у меня получается что-то вроде такого:
static long
A5 (char* begin)
{
char* next = begin + 1;
bool BREAK = false;
while (!BREAK)
{
if (*next == 0)
{
if (*(next-1) == 0)
{
BREAK = true;
}
else
{
next++;
}
}
else
{
next += 2;
}
}
return (long)(next - begin) - 1;
}
Время его выполнения такое же как и у A0
A5:
2.9989265 seconds
2.9958975 seconds
2.9939577 seconds
A0:
2.9941996 seconds
2.9946799 seconds
2.9830016 seconds
Если рукопашный костыль BREAK заменить на встроенный в C# костыль
break, то скорость выполнения не меняется.
----------
Занимательное наблюдение: если в главном if-е инвертировать условие:
if (*next != 0)
{
next += 2;
}
else if (*(next-1) == 0)
{
BREAK = true;
}
else
{
next++;
}
то скорость работы существенно замедляется (до 4.26 секунды). Видимо в тройном if-else_if-else ошибается процессорный блок отвечающий за спекулятивное выполнение обеих веток if-else.