【内存池】讨论为什么 要自己实现内存池
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:
https://github.com/colinsusie/colinlib
lzh:
这个uthash全是宏啊
lzh:
我感觉作者在炫技
半岛小鱼:
@清水云间 内存池? 有试过tcmalloc 吗
lzh:
看过一点,我也抄了
半岛小鱼:
@清水云间 直接用不好吗
lzh:
它是多线程的,对我价值不大
半岛小鱼:
直接用能满足你的需求吗
lzh:
不能
lzh:
我们的要求是个单文件 # C文件?
lzh:
lzh:
这个和我的实现差不多
半岛小鱼:
@清水云间 是的,tcmalloc 你开一个线程,就是只有一个线程 ,没有多线程呀
半岛小鱼:
colinlib 和std 比 有什么优势?@清水云间 @0114 0112 0127
lzh:
有这些原因 1lua只有300k不到,不可能给它带一个tcmalloc这么大的东西,2 lua是系统的部件,系统中有其他内存管理器,引入tcmalloc不可控,自己实现虽然耗内存但是可控 3 自己实现的内存池可以实现方便实现监视接口
lzh:
colinlib是c实现的,功能单一,应该会比atd快,我得明天使用了才能得出结论
半岛小鱼:
@清水云间 多谢解惑
lzh:
其实还有一点是tcmalloc是多线程安全,在threadb local cache不够的时候好像会用上锁,这个特性恰恰是我们不需要的
半岛小鱼:
[图片]
半岛小鱼:
为什么要换掉,换成什么?