首页 > 解决方案 > 在 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%

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

标签: performancegarbage-collectionocamlprofiling

解决方案


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

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

t.orig_items <- new_entry :: t.orig_items

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


推荐阅读