为什么现代浏览器 JS 引擎是多线程的?

Why are modern browser JS engines multi-threaded?

我了解现代浏览器的 JS 引擎(如 V8、Spidermonkey、Chakra 等)在内部使用线程池,即使只有一个线程(运行 事件循环)暴露给 JS 程序员.

显然,(很少使用的)Web Worker 需要多线程(或多进程)——否则它们无法利用多个 CPU 核心。我的问题是,除了来自Web Workers,用多线程实现JS引擎有什么好处?

为什么 JS 引擎不能通过在内部依赖于 JS 程序员使用的相同事件循环,在需要执行任何 IO 时使用非阻塞 OS 调用来始终保持单线程?

澄清一下:即使用户只打开一个 window 和一个选项卡,JS 引擎也会使用线程池。

编辑:已回答 here

脚本引擎的许多部分都受益于并行化,因为它们可以 运行 同时针对脚本的不同部分或相互关联:

  • 正在解析
  • 编译
  • JIT,优化
  • debugging/logging/profiling
  • 垃圾收集
  • 图形

这甚至不涉及在不同使用环境(工作脚本、浏览上下文)的多个引擎实例之间共享。