手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

11|基于C语言的虚拟机(二):性能增长10倍的秘密

你好,我是宫文学。
上一节课,我们初步实现了一个 C 语言版本的虚拟机,让它顺利地跑起来了。你想想看,用 TypeScript 生成字节码文件,然后在一个 C 语言实现的虚拟机上去运行,这个设计,其实和 Java 应用、Andorid 应用、Erlang 应用、Lua 应用等的运行机制是一样的。也就是说,如果退回到智能手机刚诞生的年代,你完全可以像 Android 的发明人一样,用这种方式提供一个移动应用开发工具。
其实,我国最新的自主操作系统 HarmonyOS,也是采用了像我们这门课一样的虚拟机设计机制,而且用的就是 TypeScript 语言,这也是我这门课采用 TypeScript 作为教学语言的原因之一。虽然我还没有看到 HarmonyOS 的虚拟机代码,但并不妨碍我去理解它的实现原理。当然了,你在学完这门课以后,也会更容易理解 HarmonyOS 的开发方式,而且也有助于你阅读它的虚拟机的代码。
好了,对于我们当前成果的吹捧到此打住。让我们回到现实,现实有点残酷:我们当前实现的基于 C 语言的虚拟机,在上一节课的性能测试中,竟然排名倒数第一。这显然不正常,这也说明了在虚拟机的设计中,我们还有一些重要的设计考虑被忽视了。
那这一节课呢,我们就来分析一下导致我们虚拟机性能不高的原因,并且针对性地解决掉这个问题。在这个过程中,你会加深对计算机语言的运行时技术的理解,特别是对内存管理的理解。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

基于C语言的虚拟机性能提升10倍的秘密,本文深入分析了导致虚拟机性能不高的原因,并提出了针对性的解决方案。首先,文章介绍了现代JavaScript引擎的高性能特点,以及V8引擎的即时编译技术。然后,重点讨论了语言的运行时对性能的影响,特别是内存管理机制。文章指出,内存管理中申请和释放内存可能导致巨大的性能开销,并且详细介绍了栈和堆这两种内存管理机制的特点和影响。最后,针对C语言虚拟机的内存管理存在的问题,提出了优化设计方案,以减少内存碎片化和提高性能。 在优化方面,文章提出了两次优化方案。首先,通过重新编写栈桢内存申请程序,成功将内存申请和释放的次数降低到原来的1/4。其次,采用Arena内存管理技术,从操作系统申请大块内存,然后自行分配,以减少内存分配的次数,从而提高性能。经过这些优化,虚拟机的性能得到了显著提升,约为原版本的10倍。 除了内存管理机制的优化,文章还提到了其他提升虚拟机性能的技术,如减少函数调用次数、优化操作数栈的操作等。最后,文章提出了思考题,引导读者进一步思考内存布局的优化可能性,以及将优化思路应用于TypeScript版本的栈机,以提升其性能。 通过本文的深入技术分析和解决方案的提出,读者可以深入理解计算机语言运行时技术和内存管理,为优化虚拟机性能提供了有益的参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 罗 乾 林
    发现代码中opStackSize的大小为固定值,是否可以通过数据流分析的方法,计算出实际需要的最大操作数栈大小,我想这样也能减小栈帧的大小

    作者回复: 没错,我这里偷懒了。我有时间会补上。 有兴趣的同学也可以把这里补上。

    2021-09-03
  • 大豆
    原来如此,Java,dart中一开始为堆,栈分配固定的内存大小。就是采用的Arena内存管理技术,从而减少了系统调用。 从计算机硬件角度来看,Arena 内存管理技术能够增加l1,l2,l3的缓存命中率,减少从物理内存的读取次数,从而来提升效率。 老师,我的想法对吗?
    2021-09-01
    1
  • ifelse
    学习打卡
    2022-09-14归属地:浙江
  • 功夫熊猫
    感觉可以先用写个内存池之类的,然后每次就从内存池调用
    2022-08-06归属地:江苏
  • ...
    用JS实现的AST以及栈虚拟机不存在这种问题 是因为JS中创建对象时已经使用Arena内存管理技术。但C语言是底层语音没有这些优化,所以会出现C还不如JS的性能问题?
    2021-10-31
  • 云师兄
    语言运行时优化的关键是内存管理的栈和堆的分配!
    2021-10-08
  • 奋斗的蜗牛
    想不到c语言版的栈帧还可以怎么减少空间
    2021-09-02
  • qinsi
    目前这个vm的ts版本无论是字节码还是堆栈都是用Array存储的。入栈和出栈操作都是在Array尾部进行的,而Array是会动态调整大小的。一个可能的优化是事先固定Array大小并自己维护栈顶指针;也可以仿照Arena来尝试优化新创建Array的开销;还可以考虑用Buffer/ArrayBuffer替代Array。不过v8是个高度优化的引擎,上述这些优化究竟有没有作用还要看profile的结果。
    2021-09-01
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部