Для быстрой MTF (http://en.wikipedia.org/wiki/Move-to-front_transform) мне нужно быстрее версию перемещения полукокса из внутри массива в перед ним:Fast memmove для x86 и +1 сдвиг (для Move-на-перед преобразованием)
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 (преобразование Burrows-Wheeler)
Компилятор GCC.
Есть ли основания полагать, что поставляемый «memmove» можно улучшить? Не зная, что вы подразумеваете под MTF или BWT, можете ли вы избежать этих действий? –
@David Thornley, Это ограниченный случай для перемещения. Наиболее распространенным является перемещение небольшой части массива 256. Смещение фиксировано и равно +1. Кроме того, этот код является горячей точкой, так как он выполняется полностью для каждого символа в файле размером 5 ГБ. – osgx
Благодарим вас за разъяснение. –