在我们的应用程序中,我们有一个产生字符的类,另一个消耗它们。当前的实现动态分配字符(使用new
),并在消耗时删除它们(使用delete
)。这一切都非常缓慢,我正在寻找方法来取代该实现以提高其性能。C++中的字符串生产者/消费者:std :: deque <char>或std :: stringstream?
我需要的语义是标准类queue
的语义:推在前面,在后面弹出。默认实现使用deque
IIRC。 deque
通常是使用内存的“块”或“块”来实现的,所以我期望调用OS内存分配器的次数少得多,而且速度显着提高,并且只需很少的额外内存使用量。
但是,由于排队的数据是字符(可能是宽字符),所以可以使用标准输入/输出流类,即字符流stringstream
。 AFAIK,他们的行为也像队列一样。
先验是否有更好的选择?这两个类是否有类似的分配模式?我可以尝试和衡量两者的表现,但也许它并不重要,或者是足够好的。在那种情况下,哪个最简单/最安全?
次要问题是生产者和消费者之间的并发。我可以将访问限制为顺序的(在同一个线程上),但对于当前的多核硬件,线程安全的实现可能在性能方面是有益的。
感谢您的智慧,然后再潜入并开始编码。
我可能会去'std :: deque',因为它是专门为处理这种情况而设计的。另一种可能性是固定大小的队列,当队列满时就会阻塞。通过适当的大小,阻塞通常实际上是可取的(如果一方太落后,阻塞可以给它更多的CPU时间,以便有机会赶上)。 –
std :: deque的连续内存需求可能会影响性能,消费者的一些大型realloc不够快。虽然尝试它可能是最好的答案 –
我不认为'std :: deque'具有连续的内存要求。事实上,Josuttis说的相反。 –