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)或者其他内存管理技术,不应该采用实时申请。