改进我的redblack树实现

时间:2013-03-12 14:13:50

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

我写了一个rb-tree实现。使用malloc分配节点。最好在开头分配一个大表,并使用该空间分配节点,并在每次表溢出时将大小加倍。假设分配时间很长,我不确定这会使插入操作更快一些。

1 个答案:

答案 0 :(得分:1)

分配一个大块(并自行拆分)与分配大量小块是否更好的问题适用于许多情况。并没有一个通用的答案。但是,一般情况下,可能分配大块的速度要快一些。但加速(如果有的话)可能不会很大。根据我的经验,在高度并发的系统中进行单个大型分配通常是值得的,并且大量使用动态分配。如果您有一个单线程应用程序,我的猜测是每个节点的分配构成了插入操作的非常小的成本。

一些一般性的想法/评论:

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

最终,您需要测试它并测量差异。您可以做的一件简单的事情就是编写一个简单的“丢弃”测试,分配您希望处理的节点数量,并计算所需的时间(然后可能还需要时间来释放它们)。这可能会给你一些分配成本的大概估计。