大牛内存分配经验

大致是这样,实际要复杂一些.有很多判断,申请大小为2000KB以上,走操作系统mmap调用,小于3408字节走一个跳表查询,会在16种大小的切片中选择合适的切片,可选的有N个方案,优先少bit数,同时限制最大浪费不能超过20%,平均浪费小于10%, 还有就是3408字节–4KB的一种情况,(4KB+1)-16KB的会在1KB/4KB的切片中选择最合适的切片
例如4097字节选择5个1KB的连续块,这样的浪费比较少,16KB–2000KB的全部是4KB的N倍数,2000KB就是连续500个4K块.使用了预处理软件定义好最优方案,自动生成跳表数据结构代码,实际代码这块就是几个简单的判断+跳表,处理开销大约只有几个ns,个人估计大小判断这块只有2ns的开销.
最近有空闲时间,又做了一些优化,比年初的版本性能又有了大幅度提升,目前so动态链接方式的库代码,malloc 4KB 总开销已经压缩到了8.8ns左右(intel 9400F 2.9G), 其中主要开销是so动态链接接口的开销,thread local ptr.get()的查询开销,按照数据块大小选择不同大小切片的开销,最后才是bitmap核心代码的开销.bitmap核心代码的开销估计只占一半.新一代bitmap的算法比传统算法快很多,自研内存库外部表现比Google tcmalloc的4KB申请大约外部性能提升80倍,实际内存分配的bitmap核心代码有2个数量级以上的性能提升.
关于新一代bitmap算法,有一个比较慢的开源实现,可以参考Go语言的内存分配,但也比传统算法快太多了,Stefno:图解Go语言内存分配
性能有大幅提升的主要原因是bitmap查找的时候使用了AVX之类的SIMD指令?
是的,有几条汇编代码,极大的提升了性能,大约只到SSE4.2指令,一些优化有黑科技,例如:CPU硬件设计中的软件优化算法,早期除法比Intel CPU硬件指令除法有5倍性能提升的软件仿真算法,64bit移位目前比Intel CPU有3倍性能提升的软件仿真算法…
总体,还是非常复杂的,工程上的优化很复杂,不是单独几个点,代码总行数也远超其他内存分配库的规模, 也基本重写了用到的std库.
迁移到ARM的话,基本没有困难,就是重新编译一次的事情,性能会慢很多,每个函数都还是有一套标准C/C++语言的算法垫底的.

posted @   zjh6  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示