谈谈C,C++内存申请器 [1]

     C语言中,申请内存通常都在使用 malloc/free。

 

     C++语言中,申请内存空间,一般使用 new/delete 运算符,且new/delete 中包含了 malloc/free 的过程,还包含了 对象的构造,析构过程,所以它的执行效率通常要比malloc/free低。所以我们直接来谈malloc/free.

 

     需要测试,故写了一个简单的测试程序,让增长型的动态申请内存,1, 2, 4, 8 ... 4MB, 测试每一个空间的时候,需要循环1000000次 malloc/delete 过程, 以下是简单的测试结果。

 

     测试环境: AMD X4 B35 3.41GHz, DDR3-2G, XP SP3。

     测试结果:

       (VS2008 默认 Release 版本, 编译)

       (New 实则为malloc, Delete 实则为 free)

====================================================
loop 1000000
size 1 B, 1 bytes
SYSTEM:
New:    70.000000 ms, adver 0.000070 ms
Delete: 64.000000 ms, adver 0.000064 ms

====================================================
size 2 B, 2 bytes
New:    59.000000 ms, adver 0.000059 ms
Delete: 81.000000 ms, adver 0.000081 ms

====================================================
size 4 B, 4 bytes
New:    78.000000 ms, adver 0.000078 ms
Delete: 67.000000 ms, adver 0.000067 ms

====================================================
size 8 B, 8 bytes
New:    57.000000 ms, adver 0.000057 ms
Delete: 72.000000 ms, adver 0.000072 ms

====================================================
size 16 B, 16 bytes
New:    49.000000 ms, adver 0.000049 ms
Delete: 75.000000 ms, adver 0.000075 ms

====================================================
size 32 B, 32 bytes
New:    58.000000 ms, adver 0.000058 ms
Delete: 73.000000 ms, adver 0.000073 ms

====================================================
size 64 B, 64 bytes
New:    55.000000 ms, adver 0.000055 ms
Delete: 71.000000 ms, adver 0.000071 ms

====================================================
size 128 B, 128 bytes
New:    55.000000 ms, adver 0.000055 ms
Delete: 63.000000 ms, adver 0.000063 ms

====================================================
size 256 B, 256 bytes
New:    60.000000 ms, adver 0.000060 ms
Delete: 63.000000 ms, adver 0.000063 ms

====================================================
size 512 B, 512 bytes
New:    51.000000 ms, adver 0.000051 ms
Delete: 72.000000 ms, adver 0.000072 ms

====================================================
size 1 KB, 1024 bytes
New:    80.000000 ms, adver 0.000080 ms
Delete: 117.000000 ms, adver 0.000117 ms

====================================================
size 2 KB, 2048 bytes
New:    91.000000 ms, adver 0.000091 ms
Delete: 108.000000 ms, adver 0.000108 ms

====================================================
size 4 KB, 4096 bytes
New:    93.000000 ms, adver 0.000093 ms
Delete: 106.000000 ms, adver 0.000106 ms

====================================================
New:    93.000000 ms, adver 0.000093 ms
Delete: 108.000000 ms, adver 0.000108 ms

====================================================
size 16 KB, 16384 bytes
New:    85.000000 ms, adver 0.000085 ms
Delete: 111.000000 ms, adver 0.000111 ms

====================================================
size 32 KB, 32768 bytes
New:    97.000000 ms, adver 0.000097 ms
Delete: 105.000000 ms, adver 0.000105 ms

====================================================
size 64 KB, 65536 bytes
New:    156.000000 ms, adver 0.000156 ms
Delete: 267.000000 ms, adver 0.000267 ms

====================================================
size 128 KB, 131072 bytes
New:    190.000000 ms, adver 0.000190 ms
Delete: 238.000000 ms, adver 0.000238 ms

====================================================
size 256 KB, 262144 bytes
New:    194.000000 ms, adver 0.000194 ms
Delete: 227.000000 ms, adver 0.000227 ms

====================================================
size 512 KB, 524288 bytes
New:    1693.000000 ms, adver 0.001693 ms
Delete: 1242.000000 ms, adver 0.001242 ms

====================================================
size 1 MB, 1048576 bytes
New:    1735.000000 ms, adver 0.001735 ms
Delete: 1257.000000 ms, adver 0.001257 ms

====================================================
size 2 MB, 2097152 bytes
New:    1635.000000 ms, adver 0.001635 ms
Delete: 1293.000000 ms, adver 0.001293 ms

====================================================
size 4 MB, 4194304 bytes
New:    1622.000000 ms, adver 0.001622 ms
Delete: 1305.000000 ms, adver 0.001305 ms

 

    从结果可以可以看出, malloc,free 对大型的内存空间申请很吃力, 当大小上升到 60 KB 的时候, 已经需要花费100微秒了, 到申请一个1MB以上的空间需要花费1毫秒的时间。

 

    由上面的结果,我们总结出了两点信息,

          1、 malloc/free 或者 new/delete 适合小块内存申请,(64KB以下)

          2、程序需要大块内存(大于500KB)的时候,应当提前创建,并且使用缓存链(MemoryCache)或者其他内存管理技术,不应该采用实时申请。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值