快速memmove for x86和+1 shift(用于Move-to-front变换)

时间:2010-09-14 16:04:19

标签: optimization low-level bzip2 archiving memmove

对于快速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(Burrows-Wheeler变换)之后的文本文件

编译器是GCC。

2 个答案:

答案 0 :(得分:0)

如果你预先分配比你需要它更大的缓冲区,并将你的初始数组放在中间位置(或者最后,如果你永远不必以那种方式扩展它)那么您可以通过更改数组开头的地址而不是移动所有元素来追加项目(最多限制)。

你显然需要跟踪你已经移动了多远,所以你可以重新分配,如果你的现有分配开始下降,但这仍然比移动所有数组更快参赛作品。

答案 1 :(得分:0)

您还可以使用专用数据结构而不是数组来加速正向变换。 可以使用链表列表构建快速实现,以避免数组元素完全移动。

请参阅http://code.google.com/p/kanzi/source/browse/java/src/kanzi/transform/MTFT.java

对于逆变换,结果表明数组与链表一样快。