为何大栈内存分配无时间成本?实测200字节与200万字节耗时一致
内存分配耗时相同的原因分析
出现200字节与2000000字节内存分配耗时一致的现象,主要和现代内存分配器的设计策略以及性能测试的测量逻辑有关,具体原因如下:
内存分配器的分层处理机制
主流C/C++内存分配器(如glibc malloc、jemalloc、TCMalloc)会根据分配内存的大小采用不同策略:- 小内存(通常阈值在几十KB到128KB之间):从预先分配的用户态内存池(线程本地缓存或全局arena)直接获取空闲块,无需触发系统调用,操作开销极低。
- 大内存(2MB显然属于此类):直接通过
mmap()系统调用向操作系统申请虚拟地址空间。但现代操作系统采用惰性内存分配机制——mmap()仅建立虚拟地址到物理内存的映射关系,实际物理内存只有在第一次写入该区域时才会被分配。如果测试仅执行分配操作、未对内存写入,测量到的只是mmap()系统调用的开销,而非实际物理内存分配的开销。
性能测试的测量范围限制
Quick-bench基于Google Benchmark框架,默认测量的是分配函数(如malloc)的调用耗时。小内存分配是用户态内存池的快速取块操作,大内存分配是mmap()的系统调用开销,这两种操作的耗时在现代硬件和系统上可能处于同一数量级,再加上测试本身的误差,就会呈现出耗时完全相同的结果。分配器优化抹平开销差异
现代分配器对小内存分配做了极致优化,比如线程本地缓存(TLC)让小内存分配无需锁竞争,几乎是O(1)操作;而mmap()系统调用的开销也通过内核优化大幅降低。两者的单次操作开销可能非常接近,超出了测试工具的分辨率,导致结果看起来一致。
内容的提问来源于stack exchange,提问作者bobobobo
相关产品推荐
相关产品推荐

