Fabrice Bellard采用了哪些技巧使他的JavaScript PC模拟器运行速度如此之快?

8

Fabrice Bellard的JavaScript实现的PC模拟器非常快 - 它可以在浏览器中几秒钟内启动一个小型Linux映像。

使用了哪些技术来实现这种性能?


1
一个原因可能是类型化数组,就像这里写的一样:代码是使用纯JavaScript编写的,使用了W3C的类型化数组。对于不支持此功能的浏览器,还实现了稍微慢一些的回退模式。 - Felix Kling
@Felix Kling - 它在IE9中启动Linux(并编译示例程序)非常快,即使我不认为它有类型数组(对此不确定)。 - Daniel Earwicker
@Daniel:我并不是说这是唯一的原因 ;) 我不知道IE9... - Felix Kling
是的,我只是在狂欢它有多酷!我曾经向人们解释JS的普遍强大之处,说“原则上你可以在其中编写一个虚拟机-它可以运行Linux或其他任何东西!显然,在实践中它会非常慢...”但我拥有的真正的PC启动Linux比这还要慢。所以我需要一个新的例子。当我们第一次看到它时,我和一些同事都惊讶地笑了起来。我认为这是一个廉价的骗局,直到我深入挖掘它。 - Daniel Earwicker
糟糕,这是一个重复的问题,链接为https://dev59.com/tW025IYBdhLWcg3wZlHd。 - nibot
4个回答

5
我使用了优秀的http://jsbeautifier.org/来美化压缩的JS代码。对我来说,它看起来像是精心编写、简洁明了、合理的过程式代码。这本身就是一个伟大的成就,但功劳必须与现代JavaScript解释器的出色性能分享。

5
我相信与现代JS解释器的“速度”分享一些普遍的信用,在Bellard的技术列表中是一个离题的方式(因为他没有替换浏览器引擎)。"他的优化技术是什么?"是一个很好的问题,我希望能得到更详细的记录。
到目前为止,我能列举出以下几点:
  1. (可选) JS Typed数组排除了不必要的内存分配动态(调整大小)。 固定类型(大小)允许分配连续的内存块(在这些块中没有可变长度元素的段),并统一寻址单个类型的元素。
  2. 通过自定义的极简启动程序快速引导(请参见Fabrice发布的linuxstart代码,还请参见他的名为TCCBOOT http://bellard.org/tcc/tccboot.html的项目)
  3. 经过优化的未压缩嵌入式内核(请参见内核配置,它非常小而且针对小型"Linux"进行了优化)。
  4. 最少数量的设备(设备是超级标准的,并且内核很容易识别。到目前为止,我已经正确地研究了串行设备,但其余部分也受益于类似的属性)。但Ramdisk初始化比较慢
  5. 小型(2048块)未压缩root.bin ext2系统。根系统由最小组合(rootfs、proc、tmpfs、devpts)组成。没有交换空间。
  6. (不确定)他已经为ttyS0(串口设备,或者实际上是内核UART驱动程序-确切地说)修补了缓冲区大小,该驱动程序与终端通信。使用他的term.js绑定缓冲区进行任何方式的通信(在这种情况下)都比真实设备更快。
请在刷新页面时注意浏览器缓存。如果所有内容都在内存中(由主机操作系统优化),它会非常快。使用load_binary()直接(如果被缓存-在内存中)复制“未压缩”的二进制段(start_linux.bin、vmlinux26.bin、root.bin),无需硬盘I/O限制。

2

截至2018年,法布里斯使用asm.js和WebAssembly来实现这一目标。

您可以在此处阅读更多信息。

如果您查看检查器(或我们所知道的Chrome DevTools或Firefox的检查器),则会看到一些wasm://源(在Firefox上),这意味着他使用了WebAssembly来实现这一目标。


-2

2
那不应该加速* JavaScript *。 - Marcel Korpel
1
但它生成优化的JavaScript代码(模拟优化指令)。 - Diego Sevilla
你可以在JavaScript中自己做到这一点。此外,它仍然是由JavaScript引擎进行解释/半编译的JavaScript。并且其FAQ声明:“现在生成的代码比gcc -O3慢10倍-这不是很好,但也不算太糟糕。随着LLVM、JavaScript优化器(如Closure Compiler)和JavaScript引擎本身的改进,情况会变得更好。”另外需要补充的是:JavaScript中有一些技术是完全不同的,因此需要模仿。 - Marcel Korpel
1
具有讽刺意味的是,截至2021年,Fabrice的JSLinux实际上确实使用了emscripten(他手工构建了底层仿真引擎TinyEMU,并使用emscripten将其转换为Javascript!https://bellard.org/jslinux/tech.html) - Akshat Mahajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接