c语言 - 解释器中的手动与GC内存管理,并使用malloc/free。



一个来自拥有 25 年编码经验的人的新手问题。

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


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

  • 为什么我最终选择了C?因为对我来说最重要的是性能和对一切的完全控制
  • 我为什么不早点做?因为我害怕我会迷失在记忆泄漏的海洋中。

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

我已经尝试过Boehm的GC。基本上,每当我分配内存时,都会使用GC_malloc(或GC_malloc_atomic(,每当我想释放内存时,GC_free都会使用。

这使我的口译员在我正在运行的几个基准测试中提高了 10% 的速度。

这让我感到困惑。

是因为Boehm的GC_free什么都不做(直到它真正做(吗?

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

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

我错过了吗?

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

  • 在口译员中使用GC(如Boehm的GC(是否有意义?
  • 尝试不同的malloc是否有意义 - 就提高字节码 intepreter 的性能而言
  • 在我的情况下,您还会推荐哪些其他东西?(内存管理优化和内存分配(

你的问题非常广泛,可能在这个网站上处于偏离主题的边缘。

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

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

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

你可以看看我与Fabrice Bellard共同编写的QuickJS,这是一种具有引用计数和周期检测的混合方法。

你能给出一个关于你的编程语言的更多详细信息的指针吗?

最新更新