2015-07-03 45 views
5

我們遇到了一個奇怪的現象,即在某些內存分配密集型工作負載中包含頭文件會導致5-10%的性能損失。線程構造的性能成本:錯過的優化和內存分配

該頭文件將線程池聲明爲全局變量。此線程池從不在應用程序中以任何容量(尚)使用。也就是說,除了在程序啓動時創建這個靜態線程池之外,應用程序完全是單線程的。一旦標題被刪除,性能損失就會消失。

從一些研究來看,似乎多線程應用程序可能會因某些編譯器優化不再可能導致性能降低。每當與線程相關的構造以任何形式或容量實例化時,是否有可能關閉這樣的優化?

或者,由於執行大量內存分配時性能損失似乎最明顯,有可能在編譯/鏈接階段編譯器意識到線程構造被實例化並因此切換到線程安全的內存分配器?

這發生在Linux 64位工作站上,包括GCC和叮噹聲。正在使用C++ 11的標準線程原語。

編輯我也應該提到,根據我們的測試,當使用tcmalloc分配器而不是默認分配器時,性能差異似乎消失了。

+3

這實際上很吸引人。你是否能夠發佈一個最小的可編譯示例來演示這種現象? –

+0

目標文件是否改變了添加的變量? – user2864740

+0

這是否「在程序啓動時創建靜態線程池」涉及主線程和/或輔助線程中的任何內存分配? –

回答

0

多線程malloc和一些其他選中的函數會產生鎖定成本,與您所看到的一致。我希望malloc實現可以通過線程頭文件中的一些指令更改爲線程化(和鎖定)版本。

這是一個合理的成本,並導致程序更容易理解輸出,代價是奇怪的單線程示例性能變化。