今天晚上花了大概4个小时重构了小于4kb时的内存分配器
借鉴了一下slab的想法,建了32,64,128,256,512,1024,2048字节大小内存的链表,对于小内存先分配一个页,再按对齐到2的幂的大小分割页加入到链表中。这样分配小内存的时候大部分情况下可以直接从链表中拿。
再一个是内存大小对齐,因为我选取的可分配大小都是2的幂,所以需要输入的大小需要对齐到2的幂,原来是通过多个if-else实现,现在改成了:支持硬件指令加速时,使用gcc的__builtin_clz统计高位的0个数计算出指数;不支持时,也有一个性能开销不算大的实现方式分别实现对齐和计算指数(对齐方式第一次看到给震惊了,因为是基于二进制的特性实现的,所以是可移植的。计算指数利用了De Bruijn 序列通过查表法实现)


让deepseek帮我写了一个内存分配测试,使用x86cpu自带的tsc计数器(统计的是cpu执行过的指令数)来统计时长,新的内存分配器比原来的内存分配器平均快了5倍(因为原来的分配器不算太原始,所以提升没有特别夸张)。当然极限情况下还是要遍历整个内存管理结构所以最大计数还是没有变化。
前:

后:

借鉴了一下slab的想法,建了32,64,128,256,512,1024,2048字节大小内存的链表,对于小内存先分配一个页,再按对齐到2的幂的大小分割页加入到链表中。这样分配小内存的时候大部分情况下可以直接从链表中拿。
再一个是内存大小对齐,因为我选取的可分配大小都是2的幂,所以需要输入的大小需要对齐到2的幂,原来是通过多个if-else实现,现在改成了:支持硬件指令加速时,使用gcc的__builtin_clz统计高位的0个数计算出指数;不支持时,也有一个性能开销不算大的实现方式分别实现对齐和计算指数(对齐方式第一次看到给震惊了,因为是基于二进制的特性实现的,所以是可移植的。计算指数利用了De Bruijn 序列通过查表法实现)


让deepseek帮我写了一个内存分配测试,使用x86cpu自带的tsc计数器(统计的是cpu执行过的指令数)来统计时长,新的内存分配器比原来的内存分配器平均快了5倍(因为原来的分配器不算太原始,所以提升没有特别夸张)。当然极限情况下还是要遍历整个内存管理结构所以最大计数还是没有变化。
前:

后:
