代码之家  ›  专栏  ›  技术社区  ›  korbes

队列实现基准

  •  0
  • korbes  · 技术社区  · 15 年前

    我正在开始开发一系列图像处理算法,其中一些算法需要大量使用队列。你们知道这些数据结构的一个好基准吗?

    为了缩小范围,我主要使用C,但是我可以使用C++、STL和任何库。 我对数据结构库有一些了解,例如 GLib C-Generic-Library 当然还有STL的容器。另外,如果你们中的任何一个开发/知道比这些更快的队列,请建议:)

    此外,队列将有许多排队和出列操作,因此最好有一种智能的内存管理方法。

    1 回复  |  直到 15 年前
        1
  •  0
  •   nategoose    15 年前

    对于单线程应用程序,您通常只需在进入下一个项目时处理它,就可以绕过使用任何类型的队列,但在许多应用程序中,情况并非如此(例如,将数据排队等待输出)。

    无需锁定队列(无需担心其他线程),简单的循环缓冲区在性能上很难击败。如果出于某种原因,队列在创建之后需要增长,这会稍微困难一点,但是您不应该很难找到循环缓冲队列实现(或者构建自己的队列)。如果插入或提取是在信号处理程序(或中断服务例程)中完成的,那么您可能实际上需要保护读和/或写位置索引,但是如果您对目标很了解,那么您可能能够确定情况并非如此(但在有疑问时,请保护)。保护措施可能是暂时阻塞信号或中断,这些信号或中断可能会将事情放入队列中。(如果需要调整队列的大小,则需要阻止此操作)

    如果您要放入队列中的任何内容都必须动态分配,那么您可能只需要附加一个指针,并将其转换为一个列表节点。一种单链表,其中列表主控形状保存一个指向头部的指针,最后一个节点就足够了。从头部取出并插入尾部。在这里,保护插入和提取不受竞争条件的影响是非常独立的,当列表的长度非常低时,您只需要担心一些事情。如果你真的有一个单线程的应用程序,那么你就不必担心它了。

    我没有任何实际的基准,也不能对任何库实现提出任何建议,但是这两种方法对于插入和提取都是O(1)。第一个更适合缓存(和内存寻呼机),除非您的队列大小比需要的要大得多。第二种方法对缓存不太友好,因为队列的每个成员都可以位于RAM的不同区域。

    希望这能帮助您评估或创建自己的队列。

    推荐文章