performance - 在 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 会创建原始列表的副本。因此,以这种方式使用可变列表似乎是个坏主意。
推荐阅读
- python - 如何将字符串数字转换为列表?
- node.js - 从更高的类访问函数
- python - pika.exceptions.ConnectionClosed:连接到 ***.***.*.*:5672 失败:超时
- asp.net - SelectedIndexChanging 未触发
- amazon-web-services - AWS SES - 更改 AWS 账户
- powerbi - 如何在 Power BI 中创建参数列表下拉菜单?
- html - 悬停 Chrome 字段建议会缩小输入
- ios - 两种语言的 iOS 应用程序本地化
- python - 识别并删除 AWS 中 12 个月大的孤立快照
- php - “In”子句可以处理的项目的最大限制