c - 解释器中的手动与 GC 内存管理和使用 malloc/free
问题描述
一个有 25 年编码经验的人提出的一个听起来像新手的问题。
所以,在你快速回答之前,请继续阅读。:)
我目前正在为我自己设计的一种编程语言编写一个解释器(基本上是一个字节码堆栈 VM)。整个代码库都在 C 中。(经过 2-3 次不同语言的重写,从 D 到 Nim)
- 为什么我最终选择了 C?因为对我来说最重要的是性能和对一切的完全控制
- 为什么我不早点做?因为我害怕我会迷失在记忆泄漏的海洋中
长话短说,我试图找出最好的方法是什么,始终以最佳性能为目标。
我已经尝试过 Boehm 的 GC。基本上,每当我分配内存和想要释放它时,都使用GC_malloc
(or )。GC_malloc_atomic
GC_free
这使我的解释器在我正在运行的几个基准测试中速度提高了 10%。
这让我很困惑。
是因为 Boehm'sGC_free
根本什么都不做(直到它真的做)?
现在,我决定关闭 GC 并手动完成所有操作。每个 malloc 都有其免费的,仅此而已。内存消耗下降了(我猜这是 Boehm 之前没有释放任何东西的原因)。但性能也下降了。
所以,我决定尝试一个......不同的malloc。在这种情况下,rpmalloc。并且性能再次提高。
我错过了什么吗?
而且由于您可能对问题是什么感到困惑:
- 在解释器中使用 GC(如 Boehm 的)是否有意义?
- 尝试不同
malloc
的 s 是否有意义 - 就提高字节码解释器的性能而言 - 在我的情况下,您还会推荐哪些其他东西?(内存管理优化和内存分配)
解决方案
您的问题非常广泛,可能在本网站的主题边缘。
在解释环境中有不同的垃圾收集方法,但哪种技术最适合您的要求,很大程度上取决于您的语言的语义。
您坚持性能,但没有绝对的性能衡量标准:您是否需要非常低的延迟,这会使经典的标记和扫描 gc 不足,或者您是否希望在长任务上获得更好的平均性能?在这种情况下,生成机器代码和减少内存分配将比调整垃圾收集方法更能提高性能。
垃圾收集中最困难的任务是首先让它正常工作。您可以对一些简单的对象(例如字符串和 bignums)使用引用计数,并为可能有循环的其他对象使用更高级的技术。
您可以查看我与 Fabrice Bellard 共同创作的QuickJS ,它是一种具有引用计数和循环检测的混合方法。
您能否指出有关您的编程语言的更多详细信息?
推荐阅读
- python - 在 python 中使用正则表达式创建列表列表
- android - 包含“espresso-contrib:3.1.0”后:任务“:app:processDebugAndroidTestResources”执行失败
- ruby-on-rails - 为什么要设计在错误页面中显示 flash 错误消息
- c - 为什么我的 CheckFactorial 脚本不起作用?
- python - Python 3 tkinter 强制子窗口在方法开始时显示
- php - 未为 Web 用户执行二进制文件
- python - Discord-Rewrite 中的清除命令有问题
- android - 从 Android Studio 中的图像中删除空格
- json - 如何在 postgres 的 jsonb 单元格内按限制 1 执行订单?
- ios - 添加 CAGradientLayer 以查看