Fabrice Bellard用Javascript如何快速地制作他的PC模拟器有什么技巧?

时间:2011-06-05 19:08:56

标签: javascript

Fabrice Bellard的PC emulator implemented in Javascript速度非常快 - 它会在几秒钟内在浏览器中启动一个小型的Linux映像

使用了哪些技术来获得这种表现?

4 个答案:

答案 0 :(得分:4)

我使用优秀的http://jsbeautifier.org/来美化缩小的JS代码。在我看来,这是一本精心编写的,非繁琐的,明智的程序代码。这本身就是一项了不起的成就,但必须与现代JavaScript解释器的惊人表现共享。

答案 1 :(得分:2)

我认为,与现代JS解释器的“速度”分享一些普遍的功劳在Bellard的技术列表中是一个很大的偏见(因为他不会取代浏览器的引擎)。 他的优化技巧是什么?是一个很好的问题,我想在其上获得更详细的记录。

到目前为止我可以说出的要点

  1. (可选)JS Typed数组排除不必要的内存分配动态(调整大小)。固定类型(大小)允许分配连续的内存块(在这样的块中没有可变长度元素的段)并统一寻址单个类型的元素。
  2. 通过自定义简约启动器快速启动(参见Fabrice发布的linuxstart代码,也可以看到他的项目名为TCCBOOT http://bellard.org/tcc/tccboot.html
  3. 优化的未压缩的嵌入式内核(参见内核配置,它非常小巧,针对小型“linuxes”进行了优化)。
  4. 设备数量最少(设备超级标准且内核易于识别。到目前为止,我已经正确研究了串行设备,但其余部分受益于类似的属性)。 Ramdisk初始化虽然很慢但
  5. 小(2048块)未压缩 root.bin ext2系统。根系统由最小组合(rootfs,proc,tmpfs,devpts)组成。没有交换。
  6. (不确定)他修补了ttyS0(串口设备,实际上是内核UART驱动程序 - 准确)的缓冲区大小,它与终端通信。使用term.js绑定以任何方式缓冲通信(我在UART本身中没有发现传输缓冲区)。请注意,仿真(如本例所示)可以比真实的快得多。
  7. 刷新页面时还请注意浏览器缓存。如果它全部在内存中(由主机操作系统优化),它会非常快速地启动。执行直接(如果缓存在内存中)复制(使用load_binary())“未压缩”二进制段(start_linux.bin,vmlinux26.bin,root.bin)。没有硬盘I / O限制。

答案 2 :(得分:0)

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

您可以阅读更多here

如果您查看Inspector(或我们称为Chrome DevTools,或Firefox的Inspector),则会看到一些wasm://来源(在Firefox上),这意味着他使用WebAssembly来实现此目的。

答案 3 :(得分:-2)

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