2011-07-25 16 views
1

我需要一個線程不安全的無鎖malloc來在單線程應用程序中使用它。由於這個原因,我期望獲得一些性能提升。 我需要win和linux,它必須保證是單線程的。有任何想法嗎?任何線程不安全mallocs?

+8

是什麼讓你覺得'malloc()'是線程安全的? –

+7

@Frédéric:也許事實上,現代相關性*的每一個線程規範都要求它是?停止傳播無知...... –

+4

@lurii:你知道他們對過早優化的看法嗎? –

回答

1

一種方法是自己分配一個內存池,然後在內部分配本地內存(請參閱memory pool)。正如評論指出的那樣,malloc已經很聰明瞭,所以基準測試很重要。

+1

我會小心處理像「最佳方法」這樣的陳述。 'malloc()'的現代實現已經做了各種各樣的內部魔術,並且他們實際上並不是每次都進行系統調用,所以你必須進行基準測試和比較。 –

+0

好點。應該是「有時在過去爲我工作,但你的里程可能會有所不同」:)我已經相應地改變了描述。 –

+1

乾杯:-)另外,您可能需要查看一些現有的malloc和分配器。我認爲我曾經對Google的tcmalloc有過相當不錯的體驗,而且nedalloc聲稱速度非常快。另一方面,Boost的池分配器對我沒有幫助。這是非常情景化的! –

3

您是否真的對您的代碼進行了分析並顯示它在malloc中花費了大部分時間?我會說,而不是一個替代malloc,首先考慮一個替代算法,並沒有做太多的動態分配。如果這不是一個選項,我會考慮使用內存池方法(它們對於固定大小的塊可以非常快)。

+0

已經有一段時間了,但仍然是。 是的,我簡要介紹了該代碼。兩個線程上的最大性能(僅約x 1,95)我通過池化來取代所有內存分配時所達到的性能。 但在很多情況下,我甚至不會發起這樣的戰爭。我更喜歡每個線程分配器在進行多線程時不會影響我的性能。 – Iurii

1

你是否對你的代碼進行了分析並看到malloc()真的是花費時間的地方?我只想檢查一下,但如果malloc()是瓶頸,那麼可以對此做一些事情。

首先我不認爲線程鎖定是問題。

malloc()尤其是在長時間運行的應用程序中執行大量分配和釋放的主要問題是內存的fragmentationmalloc()的基本任務是查看可用內存塊並搜索足夠大以滿足所需大小的內存塊。當找到這樣一個塊時,就會根據需要使用這個塊,剩下的就是一個空閒塊。在大量分配之後,這可能導致內存碎片其中空閒內存被分割成大量的小塊。尋找一個足夠大的空閒塊是性能問題的常見原因。

存在可以被實現來解決這個正弦策略:

  • 始終分配的內存塊是2的大小的功率,舍入到最接近的邊界。這可以防止碎片。
  • 通過爲您的應用程序中的常用塊大小同時分配100個結構體來創建您自己的分配機制。維基百科在Memory pools上有一篇文章。
1

爲了回答這個問題,一些實現有編譯器選項來從malloc中移除線程安全。這個答案:Is malloc thread-safe?暗示NO_THREADS可以被定義爲從malloc中移除線程安全,但是我沒有測試過這個。

你應該聽其他帖子,但是,這不太可能是開始你的最佳化的最佳場所。