欢迎光临散文网 会员登陆 & 注册

内存分配会产生多大开销?

2023-04-07 01:29 作者:NewtonCY  | 我要投稿

写c艹的人,似乎都不太愿意new东西出来。大家认为new是开销很大的操作。大家能把结构体放在栈上,一般就不愿意把它放在堆上。即使是不得不放在堆上,不少的项目中也会使用各种各样的内存池来管理这些内存。

如果某个函数需要输出一个结构体作为结果,那么写c艹的人一定会把这个输出结构体放到函数的参数中,让调用方在栈上分配这个结构体,然后把它作为参数传递给函数。写c艹的人绝不会new一个对象然后返回它的unique_ptr,反正我是从来没有见过这种东西。

那么问题来了,我们苦心避免的内存分配开销,到底是多大的一个开销?说实话,我也很好奇。百度了一圈,又谷歌了一圈,都没有找到满意的答案。于是我写了一个简单的程序来进行测试。测试的结果是一对分配+释放操作大约需要150ns左右

测试用的内存分配器用的是windows默认的那个,即微软ucrt里面的分配器,测试程序没有多线程的case。

这个测试中,内存分配的大小和内存释放的时间都是随机的。测试时,每次申请的内存在16字节到256字节之间随机。测试的流程是先分配一万次内存,接下来每次分配内存时随机挑选一个未释放的内存释放。最后释放掉所有内存。也就是说,测试期间大部分时候,保持有一万块已分配但未释放的内存用来保证内存中有足够多的“碎片”。同时还有一个对照组。对照组执行同样的逻辑,但是不会执行内存分配和释放。比较实验组和对照组之间耗时的差值来得到内存分配的净用时。

我会把这个代码扔到github上。见评论区置顶。


内存分配会产生多大开销?的评论 (共 条)

分享到微博请遵守国家法律