C++中的字符串生产者/消费者:std::d eque<char> 还是 std::stringstream?

string producer/consumer in C++: std::deque<char> or std::stringstream?

本文关键字:std lt gt stringstream 还是 char 字符串 生产者 C++ 消费者 eque      更新时间:2023-10-16

在我们的应用程序中,我们有一个生成字符的类,另一个使用字符的类。当前实现在生成字符时动态分配字符(使用new),并在使用字符时删除字符(使用delete)。这一切都非常缓慢,我正在寻找替换该实现以提高其性能的方法。

我需要的语义是标准类queue的语义:在前面推,在后面弹出。默认实现使用 IIRCdequedeque通常使用内存的"块"或"块"来实现,因此我预计对操作系统内存分配器的调用要少得多,并且速度显着提高,并且几乎没有额外的内存使用。

但是,由于排队的数据是字符(可能是宽字符),因此另一种方法是使用标准输入/输出流类,即字符流stringstream。AFAIK,他们的行为也像排队一样。

先验有更好的选择吗?这两个类是否具有相似的分配模式?我可以尝试衡量两者的性能,但也许这并不重要,任何一个都足够好。在这种情况下,哪个最容易/最安全使用?

次要问题是生产者和消费者之间的并发性。我可以将访问限制为顺序访问(在同一线程上),但对于当前的多核硬件,线程安全实现在性能方面可能是有益的。

在我深入研究并开始编码之前,感谢您的智慧。

std::stringstream

不是队列,因为读取字符不会消耗它们。您可以简单地seekg(0)并重新阅读相同的追逐者。因此,您写的越多,您将消耗的内存就越多。

坚持std::queue.默认选择std::deque作为底层实现几乎可以肯定是正确的。

关于并发性,当任何其他线程读取或写入std::queue时写入绝对不安全。如果你想要一个高效的阻塞队列实现,你必须编写或借用一个专门为此而构建的。

我很多年前读过这个(我想,没有再读过),当时他们实际上曾经在他们破产之前开始向我发送杂志:-)。

这可能会有所帮助

http://www.drdobbs.com/parallel/lock-free-queues/208801974

作为旁注,我致力于处理财务数据的实时系统 - 我们通常使用固定长度的队列,如果消费者无法处理数据,则丢弃不适合队列的数据 - 旧数据比丢失的数据更糟糕。当然,您的要求可能会有所不同。