【问题标题】:Are multiple realloc more expensive than a huge malloc?多个 realloc 比一个巨大的 malloc 贵吗?
【发布时间】:2012-11-29 06:59:57
【问题描述】:

我正在使用动态数组来表示最小堆。有一个循环删除最小值,并将随机元素添加到最小堆,直到某些条件发生。虽然我不知道堆的长度在运行时会如何变化(有很多随机性),但我知道上限,即 1000 万。我有两个选择:

1) 使用 malloc 声明一个小数组,然后当堆中的元素数量超过长度时调用 realloc。

2) 使用 malloc 声明一个 1000 万条目数组。这避免了调用 realloc。

问题

选项 2 是否比选项 1 更有效?

我用我的代码对此进行了测试,使用 2 似乎显着减少了 (20%) 运行时间。这是由于代码中的随机性估计的。使用 malloc 声明一个 10-5000 万的大型条目数组有什么缺点吗?

【问题讨论】:

    标签: c arrays malloc realloc


    【解决方案1】:

    如果您可以腾出内存来进行大量的前期分配,并且可以带来值得的性能提升,那么请务必这样做。

    如果您坚持使用realloc,那么您可能会发现每次将大小加倍而不是增加固定数量可以在性能和高效内存使用之间取得良好的平衡。

    【讨论】:

      【解决方案2】:

      缺点是,如果您没有使用所有这些空间,则会占用大量可能需要的内存。如果您确切知道需要多少字节,由于系统调用开销,一次分配会更有效率,然后逐个分配它。通常你可能有一个上限但不知道确切的数字。花时间分配空间来处理上限可能需要 1 秒。但是,如果这种特殊情况只有上限的一半,则可能需要 0.75 秒来逐个分配。所以这取决于你认为你将获得多接近上限。

      【讨论】:

        【解决方案3】:

        不是说用realloc的时候,内存会从同一个地方扩展,也有可能会发生内存被移到另一个区域的情况。
        因此,使用 realloc 可能会导致复制您之前拥有的内存。
        还要考虑到系统调用可能需要一些开销,所以最好调用一次 malloc。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-05
          • 2012-07-23
          • 2014-08-26
          • 2014-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多