问题描述
我已经编写了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似乎会创建原始列表的副本。因此,以这种方式使用可变列表似乎不是一个好主意。