我使用动态数组来表示最小堆。有一个循环可以删除最小值,并将随机元素添加到最小堆中,直到出现某些条件。虽然我不知道堆的长度在运行时会如何变化(有很多随机性),但我知道上限,即1000万。我有两个选择:
1)使用malloc声明一个小数组,然后当堆中的元素数超过长度时调用realloc。
2)使用malloc声明一个1000万条目数组。这避免了调用realloc。
问题
选项2是否比选项1更有效?
我用我的代码对此进行了测试,并且使用2的运行时间似乎有很大的减少(20%)。这是因为代码中的随机性。使用malloc预先声明一个大型的10-50万个入口阵列有什么缺点吗?
答案 0 :(得分:6)
如果你可以节省内存以进行大量的前期分配,并且它会带来有价值的性能提升,那么一定要做到这一点。
如果您坚持使用realloc
,那么您可能会发现每次将大小加倍而不是增加固定数量可以在性能和有效内存使用之间进行良好的权衡。
答案 1 :(得分:4)
没有说当你使用realloc时,内存将从同一个地方扩展。也可能发生内存将在另一个区域移位。
因此,使用realloc可能会导致复制您之前拥有的内存
还要考虑系统调用可能需要一些开销,所以你最好再调用一次malloc。
答案 2 :(得分:2)
缺点是如果你没有使用所有空间,那么你占用了大量可能需要的内存。如果你确切地知道你需要多少字节,那么由于系统调用开销一次分配会更有效率,然后逐个分配它。通常你可能有一个上限但不知道确切的数字。花时间来处理空间来处理上限可能需要1秒钟。但是,如果这个特殊情况只有上限的一半,则可能需要0.75秒一块一块地分配。所以它取决于你认为你将获得的上限有多接近。