【发布时间】:2012-10-03 00:57:23
【问题描述】:
在我们的应用程序中,我们有一个生成字符的类,还有一个使用它们的类。当前的实现在字符产生时动态分配字符(使用new)并在使用时删除它们(使用delete)。这一切都非常缓慢,我正在寻找替换该实现以提高其性能的方法。
我需要的语义是标准类queue 的语义:在前面推,在后面弹出。默认实现使用deque IIRC。 deque 通常是使用“块”或“块”内存实现的,因此我希望对操作系统内存分配器的调用要少得多,并且可以显着加快速度,而不会增加额外的内存使用。
但是,由于排队的数据是字符(可能是宽字符),另一种方法是使用标准输入/输出流类,即字符流stringstream。 AFAIK,他们的行为也很像队列。
有更好的先验选择吗?这两个类会有相似的分配模式吗?我可以尝试衡量两者的性能,但也许这并不重要,任何一个都足够好。在这种情况下,哪个最容易/最安全?
次要问题是生产者和消费者之间的并发性。我可以将访问限制为顺序访问(在同一个线程上),但线程安全的实现可能对当前的多核硬件在性能方面有益。
在我开始编写代码之前感谢您的智慧。
【问题讨论】:
-
我可能会选择
std::deque,因为它是专门为处理这种情况而设计的。另一种可能性是固定大小的队列,当它已满时会简单地阻塞。通过适当的大小,阻塞通常是可取的(如果一侧落后太远,阻塞可以给它更多的 CPU 时间,以便它有机会赶上)。 -
std::deque 的连续内存需求可能会影响性能,因为消费者的一些大型重新分配不够快。虽然尝试它可能是最好的答案
-
我认为
std::deque没有连续的内存要求。事实上,Josuttis 的说法恰恰相反。
标签: c++ performance stream queue standard-library