在ocaml中调试多余的GC时间



我已经编写了一个B树的OCaml实现。它很慢,添加大约100k个16字节的小记录大约需要1分钟。当我分析实现时,我发现该程序将大部分时间(~58秒(用于垃圾收集。

具体功能为:

caml_garbage_collection, which consumes 58 seconds, of this:
caml_major_collection_slice consumes 63% and
caml_gc_dispatch consumes 23.5%

这种过度活跃的垃圾收集的原因是什么?我该如何调试它?

我最终通过使用OCaml的内存探查器Spacetime并按照此处的说明解决了这个问题:https://blog.janestreet.com/a-brief-trip-through-spacetime/

这是一次非常顺利的经历。我发现问题是调试数据结构。我保留了一个条目列表,作为对列表的可变引用,我更新如下:

t.orig_items <- new_entry :: t.orig_items

这样做时,OCaml会创建原始列表的副本。因此,以这种方式使用可变列表似乎是个坏主意。

最新更新