Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 队列实现基准_C_Image Processing_Queue_Benchmarking - Fatal编程技术网

C 队列实现基准

C 队列实现基准,c,image-processing,queue,benchmarking,C,Image Processing,Queue,Benchmarking,我开始开发一系列图像处理算法,其中一些算法大量使用队列。你们知道这些数据结构的好基准吗 为了缩小范围,我主要使用C,但是我可以使用C++、STL和任何库。 我对数据结构库有一些了解,比如和,当然还有STL的容器。此外,如果你们中的任何人开发/知道比这些更快的队列,请建议: 此外,队列将有大量的排队和出列操作,因此它最好有一种智能的内存管理方法。对于单线程应用程序,您通常只需处理下一个项目,就可以避免使用任何类型的队列,但是,例如,在许多应用程序中,排队等待输出的数据并不是这种情况 在不需要锁定队

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

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


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

对于单线程应用程序,您通常只需处理下一个项目,就可以避免使用任何类型的队列,但是,例如,在许多应用程序中,排队等待输出的数据并不是这种情况

在不需要锁定队列的情况下,其他线程担心简单的循环缓冲区的性能将很难被打败。如果由于某种原因,队列需要在创建后增长,这会有点困难,但是您不应该很难找到循环缓冲区队列实现或构建自己的队列。如果插入或提取是在信号处理程序或中断服务例程中完成的,那么您实际上可能需要保护读和/或写位置索引,但是如果您非常了解您的目标,那么您可以确定在怀疑保护时不是这样。保护措施可以是暂时阻断信号,也可以是中断,这可能会让事情进入你的队列。如果需要调整队列的大小,则确实需要阻止此操作

如果您在队列中放置的任何内容都必须动态分配,那么您可能只需要固定一个指针,并将其转换为列表节点。一种单链表,其中列表主控器持有指向头部的指针,最后一个节点就足够了。从头部抽出,在尾部插入。在这里,保护插入和提取不受竞争条件的影响是非常独立的,您只需要在列表的长度非常低的情况下才需要担心。如果您确实有一个单线程应用程序,那么您根本不必担心它

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


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

这实际上取决于您打算如何使用队列。它们是FIFO、DQ队列、优先级队列,还是排序都很重要?有多个线程吗?把东西放入队列和/或取出它们的争论?@Nategose:我主要对FIFO感兴趣,它运行在一个线程上。我不明白您所说的将东西放入队列和/或取出队列的争用是什么意思?争用只是一个问题,当一个队列需要由多个线程使用时。如果许多线程可以在队列中放入和取出对象,那么任何简单的实现都需要某种类型的互斥体,每个线程在插入或从队列中提取对象之前都需要获取这种互斥体。有几种方法可以实现更复杂的队列,虽然它们在单线程应用程序下执行得更差,但在多线程应用程序中通常工作得更好。