内存分配会产生多大开销?-看点
哔哩哔哩
2023-04-07 03:14:25
(资料图片仅供参考)
写c艹的人,似乎都不太愿意new东西出来。大家认为new是开销很大的操作。大家能把结构体放在栈上,一般就不愿意把它放在堆上。即使是不得不放在堆上,不少的项目中也会使用各种各样的内存池来管理这些内存。
如果某个函数需要输出一个结构体作为结果,那么写c艹的人一定会把这个输出结构体放到函数的参数中,让调用方在栈上分配这个结构体,然后把它作为参数传递给函数。写c艹的人孜孜不倦的在函数中添加输出参数,如果可以用输出参数,大家绝不会选择new一个对象然后返回它的unique_ptr,反正我是从来没有见过这种操作。
那么问题来了,我们苦心避免的内存分配开销,到底是多大的一个开销?说实话,我也很好奇。百度了一圈,又谷歌了一圈,都没有找到满意的答案。于是我写了一个简单的程序来进行测试。测试的结果是一对分配+释放操作大约需要150ns左右。
测试用的内存分配器用的是windows默认的那个,即微软ucrt里面的分配器,测试程序没有多线程的case。
这个测试中,内存分配的大小和内存释放的时间都是随机的。测试时,每次申请的内存在16字节到256字节之间随机。测试的流程是先分配一万次内存,接下来每次分配内存时随机挑选一个未释放的内存释放。最后释放掉所有内存。也就是说,测试期间大部分时候,保持有一万块已分配但未释放的内存用来保证内存中有足够多的“碎片”。同时还有一个对照组。对照组执行同样的逻辑,但是不会执行内存分配和释放。比较实验组和对照组之间耗时的差值来得到内存分配的净用时。
我会把这个代码扔到github上。见评论区置顶。