kraken icon indicating copy to clipboard operation
kraken copied to clipboard

使用 mimalloc 替换内置的内存分配器

Open andycall opened this issue 3 years ago • 3 comments

使用场景 | 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 具备的优点:

  1. 本地 thread_local 的分配内存,多线程同时分配不竞争。
  2. 更快的小空间内存分配和回收,适合于大量 JSObject 创建和销毁过程中的内存分配压力。

预计可以带来的性能提升:

  1. 更快的 Object,String 创建
  2. 更快的 GC,减少应用等待时间。

如何替换

mimalloc 和系统的 malloc 有相同的 API,不需要更改 quickjs 代码,只需要更改一下构建,让 quickjs 链接到 mimalloc 即可。

andycall avatar Dec 16 '21 05:12 andycall

是否有手段测量到替换前后性能的变化。以便确认,替换后性能是提升的

cnryb avatar Dec 16 '21 08:12 cnryb

是否有手段测量到替换前后性能的变化。以便确认,替换后性能是提升的

  1. 最简单的方案,在linux下使用time,使用相同的测试输入运行一定时间查看user/sys cpu 差别,使用mimalloc之后sys应该会下降

Zard-C avatar Mar 05 '24 06:03 Zard-C

https://github.com/openwebf/quickjs/pull/30

andycall avatar Mar 05 '24 08:03 andycall