Для быстрого MTF (http://en.wikipedia.org/wiki/Move-to-front_transform) мне нужна более быстрая версия перемещения символа из массива в его переднюю часть:
char mtfSymbol[256], front;
char i;
for(;;) { \\ a very big loop
...
i=get_i(); \\ i is in 0..256 but more likely to be smaller.
front=mtfSymbol[i];
memmove(mtfSymbol+1, mtfSymbol, i);
mtfSymbol[0]=front;
}
cachegrind показывает, что для memmove существует множество неправильных прогнозов ветвей.
Для другой версии кода (не memmove в первом примере, а этот)
do
{
mtfSymbol[i] = mtfSymbol[i-1];
} while ( --i );
Есть много байтов для чтения / записи, условных ветвлений и неправильных прогнозов ветвей
я не очень большой, так как это MTF, используемый для «хорошего» ввода - текстовый файл после BWT (преобразование Берроуза – Уилера)
Компилятор GCC.