在ocaml中调试多余的GC时间

问题描述

我已经编写了B树的OCaml实现。它很慢,大约需要1分钟才能添加大约100k的小〜16字节记录。当我对实现进行概要分析时,我发现该程序将其大部分时间(〜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似乎会创建原始列表的副本。因此,以这种方式使用可变列表似乎不是一个好主意。