2

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

我需要的语义是标准类的语义queue:在前面推,在后面弹出。默认实现使用dequeIIRC。deque通常使用“块”或“块”内存来实现,因此我希望对 OS 内存分配器的调用要少得多,并且可以显着加快速度,而几乎没有额外的内存使用。

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

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

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

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

4

2 回答 2

1

很多年前我读过这篇文章(我想,没有再读过它),当时他们实际上曾经在他们破产前开始向我索要愚蠢的钱之前把杂志寄给我:-)。

这可能会有所帮助

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

作为旁注,我在处理金融数据的实时系统上工作——我们通常使用固定长度的队列,如果消费者无法处理它,就会丢弃不适合队列的数据——旧数据比丢失的数据更糟糕。当然,您的要求可能会有所不同。

于 2012-10-03T01:28:56.123 回答
1

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

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

关于并发性,std::queue当任何其他线程正在读取或写入它时写入绝对是不安全的。如果您想要一个有效的阻塞队列实现,您将不得不编写或借用一个专门为此目的构建的。

于 2012-10-03T01:40:22.693 回答