高速な 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 );
多くのバイト読み取り/書き込み、条件付き分岐、分岐予測ミスがあります
i は、「適切な」入力に使用される MTF であるため、それほど大きくはありません。BWT (Burrows–Wheeler 変換) 後のテキスト ファイルです。
コンパイラはGCCです。