v8 的代码缓存
共 953字,需浏览 2分钟
·
2022-01-07 21:41
简介
一份 JavaScript 代码从 Blink 交给 V8 开始到执行,经历了解析,编译,运行,优化以及包括 GC 这些过程。下面这张图展示了 V8 在运行中实际测量得出的数据。
可以看到解析 Parse 和编译 Complie 所花费的时间占到了整个运行周期总时间的三分之一。所以,这是为什么 V8 需要做 code cache,引擎希望尽可能的减少解析和编译所用的时间。
其总体思想就是,既然解析和编译花费的时间占据这么大,那么满足一定条件后,V8 会把编译和解析的结果缓存下来,等到下次遇到相同的文件,直接跳过这个过程,把直接缓存好的数据拿来使用。如果你熟悉 HTTP,你会发现这个过程和 HTTP 缓存如出一辙。
使用
v8-compile-cache 提供了一个 require 钩子来使用 v8 的代码缓存。
npm install --save v8-compile-cache
require('v8-compile-cache')
设置环境变量 DISABLE_V8_COMPILE_CACHE=1 以禁用缓存。缓存目录由环境变量V8_COMPILE_Cache_Cache_DIR 定义。默认是
,缓存的文件是 .BLOB 和 .MAP 结尾。
简单来说,使用了code caching 后,当 JS 第一次被编译后,将生成的代码序列化后存储在磁盘上,后续再次加载时,会优先读取磁盘中的缓存,反序列化后执行,避免 JS 被从头编译造成重复开销。
code cache 通过加快实例化时间来减少 node 的启动时间,在 faas 场景下也有重要使用场景,自动缩扩容是 K8S 的重要特性,面对忽然到来的大流量,需要在极短的时间对函数进行扩容并可以正常相应请求,这就对 Node.js 函数的启动时间有了较高的要求,可以在构建阶段直接将代码转换为字节码并打包到镜像中,通过减少编译时间,来提升 faas 函数的启动时间。