我开始开发一系列图像处理算法,其中一些算法大量使用队列。你们知道那些数据结构的基准吗?
为了缩小范围,我主要使用C,但我可以使用C ++,stl和任何库。 我在数据结构库上有一些点击,例如GLib和C-Generic-Library,当然还有STL的容器。此外,如果你们中的任何人开发/知道比那些队列更快的队列,请告知:)
此外,队列将有大量的队列和队列操作,因此最好有一种智能的方式来管理内存。
答案 0 :(得分:0)
对于单线程应用程序,你可以经常绕过必须使用任何类型的队列,只需处理下一个项目,但有许多应用程序不是这种情况(排队数据为输出,例如)。
无需锁定队列(没有其他线程需要担心),简单的循环缓冲区将难以击败性能。如果由于某种原因队列需要在创建后增长,这有点困难,但是您不应该很难找到循环缓冲区队列实现(或构建自己的)。如果在信号处理程序(或中断服务程序)中完成插入或提取,那么您实际上可能需要保护读取和/或写入位置索引,但如果您很好地了解目标,则可以确定这不是案件(虽然有疑问保护)。保护可能是暂时阻止可能将事情放入队列的信号或中断。 (如果你需要调整队列大小,你真的需要阻止它)
如果要放入队列中的任何内容都必须动态分配,那么您可能只需要添加一个指针并将其转换为列表节点。单个链接列表,其中列表主控器保存指向头部和最后一个节点的指针就足够了。从头部提取并插入尾部。在这里保护插入和提取不受竞争条件的影响是非常独立的,当列表的长度非常低时,您只需要担心事情。如果您确实拥有单线程应用程序,那么您根本不必担心它。
我没有任何实际的基准测试,也无法对任何库实现提出任何建议,但这两种方法对于插入和提取都是O(1)。第一个是更多缓存(和内存寻呼机)友好,除非你的队列大小比它需要的大得多。第二种方法的缓存友好性较低,因为队列的每个成员都可以位于RAM的不同区域。
希望这可以帮助您评估或创建自己的队列。