簡體   English   中英

與多線程應用程序中的vector :: push_back和placement new相關聯的速度減慢

[英]Slow down associated with vector::push_back and placement new in a multithreaded application

我有一個多線程應用程序,其中我的線程利用率非常差(在每個線程1%-4%的球場,線程少於處理器)。 在調試器中,它似乎在vector :: push_back中花費了大量時間,特別是在push_back期間發生的新位置。 我已經嘗試使用reserve來避免向量擴展其容量並復制所有內容,但這似乎不是問題。 注釋掉vector :: push_backs會帶來更好的線程利用率。

使用uint64_t的向量發生此問題,因此它似乎不是復雜對象構造的結果。 我嘗試過使用標准分配器和自定義分配器,兩者都以相同的方式執行。 向量由分配它們的同一線程使用。

除非你需要將這些初始化為0,否則考慮編寫一個類似矢量的類, 它不會初始化。 我發現這可以在某些情況下提供可衡量的性能提升。

旁注:當你的探查器聲稱你花費大部分時間在64位整數上進行原始操作時,你知道你的其余代碼都得到了很好的優化。

也許一些微不足道的東西不會真正起作用,但是當push_back調用創建一個新項目時,為什么不將向量初始化為全0,並使用atoperator[]訪問元素。 這應該擺脫對矢量的任何鎖定。

如果只使用一個線程,線程利用率是否會提高? 如果是這樣,也許你正在遇到某種堆鎖,例如

在多線程C / C ++中,malloc / new在分配內存時會鎖定堆

http://msdn.microsoft.com/en-us/library/ms810466.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM