Chrome中Compile Script与Compile Code的区别及相关疑问
Chrome DevTools中Compile Script与Compile Code的区别及重复执行原因
一、两个编译步骤的具体操作
Compile Script
- 这是V8引擎针对整个脚本文件/模块的初始编译操作,核心做这些事:
- 对脚本源码做完整的语法解析,生成抽象语法树(AST)
- 完成词法作用域分析、变量提升这类预处理工作
- 生成基础字节码,同时标记出脚本里需要延迟处理的部分(比如未被调用的函数声明)
- 这个阶段是对整个脚本资源的一次性处理,一般在脚本加载完成、即将执行前触发。
Compile Code
- 这是V8对脚本内具体可执行代码片段的按需编译,属于懒编译环节:
- 当脚本里的函数第一次被调用时,V8会针对该函数代码编译生成更高效的字节码甚至机器码
- 也会处理
eval代码、new Function()这类动态生成的代码的即时编译
- 它只针对局部代码片段,不是对整个脚本的处理,触发时机是对应代码要执行前。
二、Compile Code执行两次的常见原因
- 预解析+全解析的二次编译:V8为了加快页面启动速度,会先对函数做预解析(仅验证语法,不生成完整可执行字节码),当函数首次被调用时,再做全量编译生成可执行代码,这就会触发两次Compile Code事件
- 热点代码的优化重编译:如果V8检测到某个函数被频繁调用(成为热点函数),会把之前生成的字节码重新编译成性能更高的机器码,这个优化编译过程会第二次触发Compile Code
- 动态代码生成:如果脚本里有
eval、动态创建函数这类逻辑,每生成一段新代码并执行时,都会触发Compile Code,自然可能出现多次执行的情况
三、官方性能文档未提及的原因
Chrome DevTools性能面板里的这类事件命名,是直接映射V8引擎的内部编译阶段术语,属于底层实现细节,面向前端开发者的通用性能文档不会覆盖这么深的引擎内部逻辑,要了解更细节的内容需要查看V8的官方技术文档或源码注释。
内容的提问来源于stack exchange,提问作者Kubo Ryoto
相关产品推荐
相关产品推荐

