Fabrice Bellard用了什么技巧让他的Javascript PC模拟器如此快速

What tricks did Fabrice Bellard use to make his PC emulator in Javascript so fast?

本文关键字:模拟器 PC Javascript Bellard 什么 Fabrice      更新时间:2023-09-26

Fabrice Bellard用Javascript实现的PC模拟器速度惊人——它在几秒钟内在浏览器中启动一个小型Linux映像

使用了哪些技术来获得这种性能?

我认为,在Bellard的技术列表中,与现代JS解释器的"速度"分享一些普遍的赞誉是一个很大的话题(因为他不会取代浏览器的引擎)他的优化技术是什么是一个很好的问题,我想得到一个更详细的记录。

到目前为止,我能说出的点是

  1. (可选)JS类型的数组排除了不必要的内存分配动态(调整大小)。固定类型(大小)允许分配连续的内存块(在这些块中没有可变长度元素的段),并统一寻址单个类型的元素
  2. 通过自定义的极简主义引导程序快速引导(请参阅Fabrice发布的linuxstart代码,也可以参阅他的名为TCCBOOT的项目http://bellard.org/tcc/tccboot.html)
  3. 优化未压缩嵌入式内核(请参阅内核配置,它非常小,并针对小型"linuxes"进行了优化)
  4. 最少的设备数量(设备是超标准的,很容易被内核识别。到目前为止,我已经对串行设备进行了适当的研究,但其余的都受益于类似的属性)Ramdisk初始化相当缓慢
  5. ext2系统中的小型(2048个块)未压缩root.b。根系统由最小的组合(rootfs、proc、tmpfs、devpts)组成。没有交换
  6. (不确定)他已经为ttyS0(串行端口设备,确切地说,实际上是内核UART驱动程序)修补了与终端通信的缓冲区大小。使用他的term.js绑定可以以任何方式缓冲通信(我在UART本身中没有发现传输缓冲区)。请注意,模拟(在本例中)可能比实际情况快得多

刷新页面时,请注意浏览器缓存。如果全部存储在内存中(由主机操作系统优化),它的启动速度会非常快。执行"未压缩"二进制段(start_linux.bin、vmlinux26.bin、root.bin)的直接(如果缓存在内存中)复制(使用load_binary())。没有硬盘I/O限制。

我使用了优秀的http://jsbeautifier.org/以美化缩小后的JS代码。在我看来,它就像是精心编写的、不挑剔的、合理的过程代码。这本身就是一项了不起的成就,但现代JavaScript解释器的非凡性能也值得称赞。

截至2018年,Fabrice已使用asm.js和WebAssembly来实现这一目标。

你可以在这里阅读更多。

如果你看看Inspector(或者我们称之为Chrome DevTools,或者Firefox的Inspector),你会看到一些wasm://源代码(在Firefox上),这意味着他使用了WebAssembly来实现这一点。

也许使用C到JavaScript编译器?像Emscripten一样:http://code.google.com/p/emscripten/