从缓冲区中删除字节的快速方法

时间:2013-02-26 20:53:30

标签: c optimization

有更快的方法吗:

    Vector3* points = malloc(maxBufferCount*sizeof(Vector3));
    //put content into the buffer and increment bufferCount        
    ...

    // remove one point at index `removeIndex`
    bufferCount--;
    for (int j=removeIndex; j<bufferCount; j++) {
        points[j] = points[j+1];
    }

我问,因为我有一个巨大的缓冲区,我经常从中删除元素。

3 个答案:

答案 0 :(得分:5)

不,抱歉 - 从数组中间删除元素需要O(n)次。如果您确实想要经常修改元素(即删除某些项目和/或添加其他项目),请使用链接列表 - 具有恒定时间删除和添加。相反,数组具有恒定的查找时间,而链接列表可以在线性时间内访问(读取)。因此,决定您将更频繁地做什么(阅读或写作),并根据该决定选择适当的数据结构。

但是,请注意,我(善意)认为你并没有试图犯下过早优化的罪行。如果你还没有确定这是 瓶颈的基准,那么可能只是不用担心。

答案 1 :(得分:3)

除非你知道这是一个瓶颈,否则你可以让编译器为你优化,但你可以试试memmove

这里选择的答案非常全面:When to use strncpy or memmove?

说明如下:http://www.kernel.org/doc/man-pages/online/pages/man3/memmove.3.html

答案 2 :(得分:2)

有几点要说。 memmove函数可能比你复制得更快,通常它由你的特定编译器的编写者优化,以使用C语言中没有内联汇编程序的特殊指令。我相信这些指令被称为SIMD指令(单指令多数据)?如果我错了,有人会纠正我。

如果您可以保存要删除的项目,那么您可以通过对要删除的项目列表进行排序然后进行一次通过来进行优化。这并不难,但只需要一些有趣的算术。

此外,您可以将每个项目存储在链接列表中,删除项目是微不足道的,但是您会丢失对阵列的随机控制权。

最后,您可以拥有一个额外的指针数组,数组大小相同,每个指针指向一个元素。然后你可以通过双重间接访问数组,你可以通过交换指针对数组进行排序,你可以通过使它们的指针为NULL来删除项目。

希望这会给你一些想法。通常有一种方法可以优化,但随后会变得更具针对性。