2011-04-07 43 views
0

對於序列化系統,我需要分配緩衝區來寫入數據。所需的大小並不是預先知道的,所以基本模式是mallocN字節,如果需要更多,則使用reallocN的大小將足夠容納大多數物體,使重新分配變得非常罕見。什麼是適合中型內存分配的大小?

這讓我覺得有可能是一個最佳的初始字節數,malloc可以比其他人更容易滿足。我猜在接近pagesize的地方,雖然不一定完全如果malloc需要一些家務管理的空間。

現在,我確定這是一個無用的優化,如果它真的很重要,我可以使用一個池,但我很好奇;我不能成爲第一個認爲給我的程序員,不管是哪一個字節塊都是最容易分配的,作爲開始。有沒有辦法確定這一點?

接受任何專門適用於現代GCC/G ++和/或Linux的答案。

+0

優化本身並不是無用的,但也許你應該等待優化,直到有一個具體的需求呢?或者你的手上有太多時間? :-) – 2011-04-07 01:16:59

+0

@Anders:如果我花幾個小時來研究這個,那可能是在浪費時間。看到我是否好奇可以在SO上得到答案似乎對我來說時間有效:) – porgarmingduod 2011-04-07 01:23:04

+1

@Anders K:根據我的經驗,大多數有關優化問題的海報需要關於該做什麼而不是不該做什麼的輸入。 – 2011-04-25 15:29:32

回答

-1

它在類似情況下完成的方式是爲第一個malloc分配一些重要但不是太大的塊,這將適用於大多數情況(如您所述),並且每個後續調用將請求大小加倍。

所以,如果一開始你分配100,下次你會realloc 200,然後400,800等等。通過這種方式,每次執行後,重新分配的機會就會降低。

如果內存爲我服務,那麼這就是std::vector的行爲。

編輯

最佳初始分配的大小將是一個將覆蓋大部分的情況下在一邊,但不會對對方太浪費之後。如果你的平均情況是50,但可以達到500,那麼你需要先分配50,然後每隔一個realloc分配兩倍或三倍(或倍數10),這樣你可以在1-3 realloc s中分配500,但任何進一步的realloc將是不太可能和罕見的。所以它基本上取決於您的使用模式。

+0

我非常瞭解這種方法。它根本沒有解決這個問題,這完全與確定__initial size__有關。 – porgarmingduod 2011-04-07 01:15:24

+0

是的,爲此增加了兩分錢,但你沒有提到你爲什麼要尋找優化,所以我猜這是因爲你不想浪費記憶。還有什麼你想要優化? – littleadv 2011-04-07 01:19:52

+0

問題是關於能否最有效地處理__malloc可以最有效地處理__。使用模式,即我實際需要的大小,不是問題的一部分,除了我提示'pagesize'可能會很好。 – porgarmingduod 2011-04-07 01:21:20

2

從閱讀this維基頁面看來,你的答案會有很大的不同,取決於你使用的malloc和操作系統的實現。在OpenBSD的malloc上讀取一點特別有趣。這聽起來像你也想看看mmap,但是我猜想我會說分配默認的pagesize(4096?)會被優化。

+0

其實,我很想知道在這個上做的實驗的結果。也許嘗試分配4095字節x次,看看你的時間平均值是什麼樣子,然後用4096字節,然後4097字節做同樣的實驗。您希望確保您的頁面大小確實設置爲4kb,並且可能希望在每次測試之前重新啓動計算機。任何接受者? :-) – Adam 2011-04-07 02:45:37

1

我對你的建議是找到一個合適的malloc/realloc/free源代碼,這樣你就可以在同一個源模塊(並使用相同的內存結構)中實現你自己的「malloc_first」並返回大於或等於傳遞的minimum_bytes參數的第一個可用塊。如果0通過,你會得到第一個阻塞期。

適當的聲明可能是

void *malloc_first (size_t minimum_bytes, size_t *actual_bytes); 

如何可行的這樣的承諾是,我不知道。我建議你在所有源代碼都可用的情況下嘗試使用Linux。

+0

是的,我想。但在這一點上,我可能會更好,只需使用內存池(專業實現已經可用)和一個簡單的分配策略就可以了。但是你的「控制自己」的一般建議可能是現實。 – porgarmingduod 2011-05-04 14:33:59

相關問題