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

nib*_*bot 7 javascript

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

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

Dan*_*ker 5

我使用了优秀的 ht ​​tp://jsbeautifier.org/来美化缩小的 JS 代码。在我看来,它就像是精心编写的、不繁琐的、合理的程序代码。这本身就是一项了不起的成就,但这一功劳必须与现代 JavaScript 解释器的惊人性能分享。


Yau*_*ich 5

我相信,与现代 JS 解释器的“速度”分享一些普遍的荣誉在 Bellard 的技术列表中远远不是主题(因为他没有取代浏览器的引擎)。他的优化技术有哪些?这是一个很好的问题,我想得到更详细的记录。

到目前为止我能说出的要点

  1. (可选)JS 类型数组排除了不必要的内存分配动态(调整大小)。固定类型(大小)允许分配连续的内存块(这些块中没有可变长度元素的段)并统一寻址单一类型的元素。
  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 绑定进行缓冲(我发现 UART 本身没有传输缓冲区)。请注意,仿真(如本例所示)可能比真实情况快得多。

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