在我们的应用程序中,我们有一个生成字符的类,另一个使用字符的类。当前实现在生成字符时动态分配字符(使用new
),并在使用字符时删除字符(使用delete
)。这一切都非常缓慢,我正在寻找替换该实现以提高其性能的方法。
我需要的语义是标准类queue
的语义:在前面推,在后面弹出。默认实现使用 IIRCdeque
。deque
通常使用内存的"块"或"块"来实现,因此我预计对操作系统内存分配器的调用要少得多,并且速度显着提高,并且几乎没有额外的内存使用。
但是,由于排队的数据是字符(可能是宽字符),因此另一种方法是使用标准输入/输出流类,即字符流stringstream
。AFAIK,他们的行为也像排队一样。
先验有更好的选择吗?这两个类是否具有相似的分配模式?我可以尝试衡量两者的性能,但也许这并不重要,任何一个都足够好。在这种情况下,哪个最容易/最安全使用?
次要问题是生产者和消费者之间的并发性。我可以将访问限制为顺序访问(在同一线程上),但对于当前的多核硬件,线程安全实现在性能方面可能是有益的。
在我深入研究并开始编码之前,感谢您的智慧。
std::stringstream
不是队列,因为读取字符不会消耗它们。您可以简单地seekg(0)
并重新阅读相同的追逐者。因此,您写的越多,您将消耗的内存就越多。
坚持std::queue
.默认选择std::deque
作为底层实现几乎可以肯定是正确的。
关于并发性,当任何其他线程读取或写入std::queue
时写入绝对不安全。如果你想要一个高效的阻塞队列实现,你必须编写或借用一个专门为此而构建的。
我很多年前读过这个(我想,没有再读过),当时他们实际上曾经在他们破产之前开始向我发送杂志:-)。
这可能会有所帮助
http://www.drdobbs.com/parallel/lock-free-queues/208801974
作为旁注,我致力于处理财务数据的实时系统 - 我们通常使用固定长度的队列,如果消费者无法处理数据,则丢弃不适合队列的数据 - 旧数据比丢失的数据更糟糕。当然,您的要求可能会有所不同。