虽然内存管理在不同系统中存在差异,因此这个基准测试并不是最终的参考指标,但现在的情况往往比较标准化,因此这些结果应该是安全的参考点(如果您知道一个实际案例与此不符,请告诉我)。我正在使用Windows 7,搭载2.10GHz四核Intel Core i3 2310M处理器和4GB的内存,虽然不是最好的硬件,但是目前是我能用到的最好的。
这个基准测试会从一定量的内存(INITIAL_MEMORY)开始,并重复以小量(BYTE_STEP)为单位的重新分配,直至完全分配/释放ALLOCATE_MEMORY。为此,它尝试了6种方法:
那么,第一个测试:从2MB开始,以1KB的步长分配±1MB:
Increasing Lossful Malloc took 3 ms
Decreasing Lossful Malloc took 5 ms
Increasing Malloc took 1 265 ms
Decreasing Malloc took 744 ms
Increasing Realloc took 316 ms
Decreasing Realloc took 0 ms
正如我们所看到的,使用memcpy手动复制始终比realloc慢,因为在这种情况下,malloc保证分配新内存,并且您被迫在每次分配中复制数据,这表明realloc确实在某些情况下重用相同的地址并增加块大小。因此,如果你想保留你的数据,可能需要使用realloc。为了简化问题,我不会继续测试这种无损malloc方法。
让我们继续进行下一个测试:32MB初始内存,16MB以16KB步长分配:
Increasing Lossful Malloc took 4 ms
Decreasing Lossful Malloc took 4 ms
Increasing Realloc took 21 453 ms
Decreasing Realloc took 0 ms
现在我们可以看到,相对于其他测试,增加realloc需要非常长的时间。减少realloc甚至还没有达到1毫秒。这表明如果您不想保留内存,您应该使用free->malloc方法,或者呢?请看下面的结果:
Increasing Lossful Malloc took 777 ms
Decreasing Lossful Malloc took 729 ms
Decreasing Realloc took 19 ms
(这些结果非常接近,所以我运行了几个测试并对它们进行了平均。)
当使用realloc()时,显然减小内存大小更加高效。这可能是因为realloc不需要寻找新的内存块,它只使用之前的内存块并缩小它。如果您正在大量分配内存,则性能差异很大。
此外,我们可以看到,即使两者基本上执行相同的操作:查找内存块并分配它们,增加malloc()的速度也略慢于减小的速度。这种差异可能是因为在搜索较大内存块时,malloc需要花费更长的时间来搜索平均值,而在搜索较小内存块时,malloc需要花费更少的时间。例如,如果有一个30MB的内存块,分配16MB的malloc会使用它,但分配32MB的malloc将不得不跳过它并继续搜索,从而浪费时间。这可能是我的测试结果如此不同的原因。
总之/TLDR:
这是我的基准源代码:test.cpp
realloc的优点在于它会保留内存的内容。如果使用free + malloc的话,需要重设数组中的数据。
realloc(重新分配内存)可以原地更改块的大小,或分配一个新的块并复制尽可能多的内容。相比之下,malloc和free只能分配一个新的块,并且您必须自己执行复制操作。
坦率地说,由于realloc与C ++不兼容,它在今天的使用中并不常见。因此,内存管理器倾向于不针对其进行优化。
我有一个程序,通过调用free()和malloc()函数创建动态数组。我想通过重复使用现有的数组来优化它。然而,基准测试表明,平均而言,realloc()的速度比仅仅调用free()和malloc()要慢。我猜这是有道理的,因为有时候数组会增长,可能需要进行复制。
"在再次调用malloc()函数之前,不要使用free()函数"
如果你释放了现有的数组,就会丢失所有内容,因此你不能像通常那样“增加”数组。