在我看來,我曾經在boost :: pool中玩過幾次,我正在認真地用很多對象「流失」來敲擊堆。通常我使用boost::object_pool
或boost::pool_alloc
作爲STL模板參數。但結果總是表現幾乎沒有變化,或明顯惡化。你有沒有使用boost :: pool獲得顯着的加速?
我很想聽聽有關它的任何成功案例。
我應該尋找什麼樣的東西在分析輸出可能表明boost :: pool可能有幫助?
難道要改善舊的malloc真的很難嗎?
在我看來,我曾經在boost :: pool中玩過幾次,我正在認真地用很多對象「流失」來敲擊堆。通常我使用boost::object_pool
或boost::pool_alloc
作爲STL模板參數。但結果總是表現幾乎沒有變化,或明顯惡化。你有沒有使用boost :: pool獲得顯着的加速?
我很想聽聽有關它的任何成功案例。
我應該尋找什麼樣的東西在分析輸出可能表明boost :: pool可能有幫助?
難道要改善舊的malloc真的很難嗎?
內存池是海事組織交易風格的處理,你可以分配到池中,然後在交易完成最有效的,只是將其轉化爲遺忘。真正的加速並不是每個分配速度都會更快,因爲在一個運行時間非常長的應用程序中,您將擁有接近零的內存碎片。
在排序,這聽起來像您的應用程序不保證使用內存池
在開始優化之前,您可能需要首先跟蹤內存分配的性能問題。
因此,請縮小您的配置文件以查明問題的位置。這可能是很多調用相同的代碼,只需調用一次可能不需要很長時間。
盲目優化不好。嘗試使用谷歌內存分配器,你甚至不需要重新編譯你的應用程序。你可以找到你所需要的在這裏瞭解:
http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html
加埃塔諾
感謝您的指針。我正在玩的一件事是線程特定的內存池,但tcmalloc看起來像獲得它們的更清晰的方式。 – timday 2009-01-26 10:19:02
是,500%的速度遞增。應用程序(相當愚蠢,但有時你必須使用你所得到的)將1 std :: map中的元素複製到循環中的另一個元素(循環中有一些決策),並在多線程/進程服務器上產生分配導致堆爭用。我在第二張地圖上添加了boost池作爲分配器,結果是應用程序執行速度提高了500%。
那麼這一個實際上回答了這個問題(雖然我確實在這種情況下過早優化有罪,正如其他答覆所述)。 – timday 2009-01-26 10:20:07