kraken
kraken copied to clipboard
使用 mimalloc 替换内置的内存分配器
使用场景 | Use case
mimalloc 是一款专门针对编程语言系统而设计的内存分配器,由 microsoft 开发。
由于 quickjs 中的 GC 会频繁针对引用计数来创建销毁对象,同时不存在多线程访问同一块内存的竞争问题。由于操作系统自带的 malloc 由于需要平衡各种场景,并不能在这些情况下做到性能最优。所以选择一款专门为编程语言设计的 malloc 就有很有价值。
https://github.com/microsoft/mimalloc https://www.microsoft.com/en-us/research/uploads/prod/2019/06/mimalloc-tr-v1.pdf
mimalloc 具备的优点:
- 本地 thread_local 的分配内存,多线程同时分配不竞争。
- 更快的小空间内存分配和回收,适合于大量 JSObject 创建和销毁过程中的内存分配压力。
预计可以带来的性能提升:
- 更快的 Object,String 创建
- 更快的 GC,减少应用等待时间。
如何替换
mimalloc 和系统的 malloc 有相同的 API,不需要更改 quickjs 代码,只需要更改一下构建,让 quickjs 链接到 mimalloc 即可。
是否有手段测量到替换前后性能的变化。以便确认,替换后性能是提升的
是否有手段测量到替换前后性能的变化。以便确认,替换后性能是提升的
- 最简单的方案,在linux下使用
time
,使用相同的测试输入运行一定时间查看user/sys cpu 差别,使用mimalloc之后sys应该会下降
https://github.com/openwebf/quickjs/pull/30