首页 > 解决方案 > 解释器中的手动与 GC 内存管理和使用 malloc/free

问题描述

一个有 25 年编码经验的人提出的一个听起来像新手的问题。

所以,在你快速回答之前,请继续阅读。:)


我目前正在为我自己设计的一种编程语言编写一个解释器(基本上是一个字节码堆栈 VM)。整个代码库都在 C 中。(经过 2-3 次不同语言的重写,从 D 到 Nim)


长话短说,我试图找出最好的方法是什么,始终以最佳性能为目标。

我已经尝试过 Boehm 的 GC。基本上,每当我分配内存和想要释​​放它时,都使用GC_malloc(or )。GC_malloc_atomicGC_free

这使我的解释器在我正在运行的几个基准测试中速度提高了 10%。

这让我很困惑。

是因为 Boehm'sGC_free根本什么都不做(直到它真的做)?

现在,我决定关闭 GC 并手动完成所有操作。每个 malloc 都有其免费的,仅此而已。内存消耗下降了(我猜这是 Boehm 之前没有释放任何东西的原因)。但性能也下降了。

所以,我决定尝试一个......不同的malloc。在这种情况下,rpmalloc。并且性能再次提高。

我错过了什么吗?

而且由于您可能对问题是什么感到困惑:

标签: cmemory-managementcompiler-constructiongarbage-collectionmalloc

解决方案


您的问题非常广泛,可能在本网站的主题边缘。

在解释环境中有不同的垃圾收集方法,但哪种技术最适合您的要求,很大程度上取决于您的语言的语义。

您坚持性能,但没有绝对的性能衡量标准:您是否需要非常低的延迟,这会使经典的标记和扫描 gc 不足,或者您是否希望在长任务上获得更好的平均性能?在这种情况下,生成机器代码和减少内存分配将比调整垃圾收集方法更能提高性能。

垃圾收集中最困难的任务是首先让它正常工作。您可以对一些简单的对象(例如字符串和 bignums)使用引用计数,并为可能有循环的其他对象使用更高级的技术。

您可以查看我与 Fabrice Bellard 共同创作的QuickJS ,它是一种具有引用计数和循环检测的混合方法。

您能否指出有关您的编程语言的更多详细信息?


推荐阅读