在我們的應用程序中,我們有一個產生字符的類,另一個消耗它們。當前的實現動態分配字符(使用new
),並在消耗時刪除它們(使用delete
)。這一切都非常緩慢,我正在尋找方法來取代該實現以提高其性能。C++中的字符串生產者/消費者:std :: deque <char>或std :: stringstream?
我需要的語義是標準類queue
的語義:推在前面,在後面彈出。默認實現使用deque
IIRC。 deque
通常是使用內存的「塊」或「塊」來實現的,所以我期望調用OS內存分配器的次數少得多,而且速度顯着提高,並且只需很少的額外內存使用量。
但是,由於排隊的數據是字符(可能是寬字符),所以可以使用標準輸入/輸出流類,即字符流stringstream
。 AFAIK,他們的行爲也像隊列一樣。
先驗是否有更好的選擇?這兩個類是否有類似的分配模式?我可以嘗試和衡量兩者的表現,但也許它並不重要,或者是足夠好的。在那種情況下,哪個最簡單/最安全?
次要問題是生產者和消費者之間的併發。我可以將訪問限制爲順序的(在同一個線程上),但對於當前的多核硬件,線程安全的實現可能在性能方面是有益的。
感謝您的智慧,然後再潛入並開始編碼。
我可能會去'std :: deque',因爲它是專門爲處理這種情況而設計的。另一種可能性是固定大小的隊列,當隊列滿時就會阻塞。通過適當的大小,阻塞通常實際上是可取的(如果一方太落後,阻塞可以給它更多的CPU時間,以便有機會趕上)。 –
std :: deque的連續內存需求可能會影響性能,消費者的一些大型realloc不夠快。雖然嘗試它可能是最好的答案 –
我不認爲'std :: deque'具有連續的內存要求。事實上,Josuttis說的相反。 –