为什么现代浏览器 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
- 垃圾收集
- 图形
这甚至不涉及在不同使用环境(工作脚本、浏览上下文)的多个引擎实例之间共享。
我了解现代浏览器的 JS 引擎(如 V8、Spidermonkey、Chakra 等)在内部使用线程池,即使只有一个线程(运行 事件循环)暴露给 JS 程序员.
显然,(很少使用的)Web Worker 需要多线程(或多进程)——否则它们无法利用多个 CPU 核心。我的问题是,除了来自Web Workers,用多线程实现JS引擎有什么好处?
为什么 JS 引擎不能通过在内部依赖于 JS 程序员使用的相同事件循环,在需要执行任何 IO 时使用非阻塞 OS 调用来始终保持单线程?
澄清一下:即使用户只打开一个 window 和一个选项卡,JS 引擎也会使用线程池。
编辑:已回答 here
脚本引擎的许多部分都受益于并行化,因为它们可以 运行 同时针对脚本的不同部分或相互关联:
- 正在解析
- 编译
- JIT,优化
- debugging/logging/profiling
- 垃圾收集
- 图形
这甚至不涉及在不同使用环境(工作脚本、浏览上下文)的多个引擎实例之间共享。