【问题标题】:Improving my redblack tree implementation改进我的红黑树实现
【发布时间】:2013-02-28 02:36:12
【问题描述】:

我写了一个 rb-tree 实现。使用 malloc 分配节点。在开始时分配一个大表并使用该空间来分配节点并在每次表即将溢出时将大小加倍是否是一个好主意。假设分配的时间很重要(我不确定),这将使插入操作更快一些。

【问题讨论】:

    标签: memory-management insert red-black-tree


    【解决方案1】:

    分配一个大块(并自行拆分)与分配许多小项目是否更好的问题适用于许多情况。并且没有一个万能的答案。不过,总的来说,分配大块可能会快一点。但是加速(如果有的话)可能不会很大。以我的经验,在大量使用动态分配的高并发系统中,进行单个大型分配通常值得付出努力和复杂性。如果您有一个单线程应用程序,我的猜测是每个节点的分配构成了插入操作的非常小的成本。

    一些一般的想法/cmets:

    • 分配单个大块(并根据需要进行扩展)通常总体上会使用更少的内存。典型的通用分配器(例如,C 中的 malloc/free)每次分配都有开销。因此,例如,一个 100 字节的小分配请求可能会导致使用 128 字节。
    • 在具有大量内存碎片的内存受限系统中,可能无法分配大块内存并将其分割,而多个小块分配仍可能成功。
    • 虽然分配大块减少了分配器级别的同步争用(例如,在 malloc 中),但在从您自己的托管列表/块中获取节点时,仍然需要提供您自己的同步(假设是多线程系统) )。但随后可能必须与节点本身的插入相关联一些同步,因此它可以在相同的操作中处理。

    最终,您需要对其进行测试并衡量差异。您可以做的一件简单的事情就是编写一个简单的“一次性”测试,分配您希望处理的节点数量以及需要多长时间(然后也可能是释放它们的时间)。这可能会给你某种分配成本的大致估计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 2012-08-20
      • 2021-06-27
      • 2012-12-24
      • 2012-11-30
      • 2012-07-08
      • 2010-09-06
      相关资源
      最近更新 更多