記憶體池 討論為什麼 要自己實現記憶體池

2021-10-11 21:34:22 字數 2242 閱讀 4796

lzh:

花了一周時間寫記憶體池,結果和stl差不多快,各位有什麼優化策略嗎?主要是優化速度

願你此生不鎖眉:

大概的實現邏輯是怎樣的

願你此生不鎖眉:

現在好多自帶的記憶體池足夠用了

lzh:

現在採用的演算法是和memcached類似的slabs演算法

願你此生不鎖眉:

直接用他的不好麼

lzh:

memcached申請了不釋放的

lzh:

50萬次記憶體操作大概0.27秒

願你此生不鎖眉:

你申請釋放了?

lzh:對

願你此生不鎖眉:

網上有個不釋放的

願你此生不鎖眉:

用的陣列的

lzh:

我的應用場景是遊戲某些時間段記憶體操作比較頻繁,比如開服

lzh:

陣列我用的

lzh:

我現在的實現基本沒有遍歷操作,資料結構就是vector加list,每塊記憶體帶隱藏頭儲存記憶體管理類的位址來避免釋放記憶體的時候做遍歷

lzh:

我設定的頁大小為16k,記憶體分配的時候為了避免系統呼叫占用太多時間,我會每次mmap的時候申請160k或者320k,多出的記憶體先留下,這樣子下次申請記憶體頁的時候可以直接分配

江南:執行緒安全嗎

lzh:

為了速度,放在單執行緒內操作,所以非執行緒安全

江南:方便開放原始碼學習一下嗎

lzh:

給公司寫的,沒辦法

lzh:

就是魔改memcached

lzh:

用pprof看了下,時間太短,發現不了效能熱點,各位有啥辦法嗎

lzh:

目前比較懷疑的是程式中的迭代器

lzh:

是在發現不了就只能換成c寫一遍了

享受天空(湯和):

@lzh vector和list使用的的是std::alloc,換掉吧

享受天空(湯和):

你要麼就直接重寫,不要用他們的

lzh:

好的,我明天試試

lzh:

之前偷懶就直接用了,沒有仔細了解

江南:什麼場景要那麼極致的效能呢

lzh:

這個記憶體池其實是給lua用的,lua裡面跑遊戲邏輯,效能要求比較嚴格

江南:好吧

lzh:

剛才github找到乙個colinlib專案,用c實現了很多資料結構,感覺挺好的,大家可以看看

0114 0112 0127:

uthash

0114 0112 0127:

看這個0114 0112 0127:

github在哪@lzh

lzh:

lzh:

這個uthash全是巨集啊

lzh:

我感覺作者在炫技

半島小魚:

@清水雲間 記憶體池? 有試過tcmalloc 嗎

lzh:

看過一點,我也抄了

半島小魚:

@清水雲間 直接用不好嗎

lzh:

它是多執行緒的,對我價值不大

半島小魚:

直接用能滿足你的需求嗎

lzh:不能

lzh:

我們的要求是個單檔案   # c檔案?

這個和我的實現差不多

半島小魚:

@清水雲間 是的,tcmalloc 你開乙個執行緒,就是只有乙個執行緒 ,沒有多執行緒呀

半島小魚:

colinlib 和std 比 有什麼優勢?@清水雲間 @0114 0112 0127 

lzh:

有這些原因 1lua只有300k不到,不可能給它帶乙個tcmalloc這麼大的東西,2 lua是系統的部件,系統中有其他記憶體管理器,引入tcmalloc不可控,自己實現雖然耗記憶體但是可控 3 自己實現的記憶體池可以實現方便實現監視介面

lzh:

colinlib是c實現的,功能單一,應該會比atd快,我得明天使用了才能得出結論

半島小魚:

@清水雲間 多謝解惑

lzh:

其實還有一點是tcmalloc是多執行緒安全,在threadb local cache不夠的時候好像會用上鎖,這個特性恰恰是我們不需要的

半島小魚:

半島小魚:

為什麼要換掉,換成什麼?

為什麼要記憶體對齊

當我們聽到 記憶體對齊 這個概念時,從字面意思來看,很容易理解。那就是讓記憶體按一定規則對齊。當然 就會有人說 你這不是廢話 現在我就來說一說為什麼要記憶體對齊以及怎麼個對齊法 如何對齊 記憶體對齊 記憶體對齊 應該是 編譯器的 管轄範圍 編譯器為程式中的每個 資料單元 對於記憶體對齊問題,主要存在...

為什麼要記憶體對齊?

cpu訪問非對齊的記憶體時為何需要多次讀取再拼接?首先簡單說一下何為記憶體對齊。例如,當cpu需要取4個連續的位元組時,若記憶體起始位置的位址可以被4整除,那麼我們稱其對齊訪問。反之,則為未對齊訪問。比如從位址0xf1取4位元組就是非對齊 位址 訪問。簡單的看來,對於乙個資料匯流排寬度為32位的cp...

什麼是記憶體對齊?為什麼要記憶體對齊?

要了解為什麼要記憶體對齊,首先我們要了解什麼是記憶體對齊 typedef struct a typedef struct b 分別對他們求大小,sizeof a sizeof b 我們所得到的結果是不同的,sizeof a 24而sizeof b 16為什麼會產生不一樣的結果呢?這是非常簡單的乙個例...