V8有了全新的超快速非优化JS编译器,性能提高5-15%( 三 )
本文插图
一个 V8 JavaScript 堆栈框架
这个 JS 调用约定在优化框架和解析框架之间共享 , 这样一来 , 当我们在调试器的性能面板中调优代码时 , 就能以最小的开销遍历堆栈 , 诸如此类 。
对于 Ignition 解析器来说 , 约定变得更加显式 。 Ignition 是基于寄存器的解析器 , 这意味着存在一些虚拟寄存器(请勿与机器寄存器混淆!)来存储解析器的当前状态——其中包括 JavaScript 函数的本地变量(var/let/const 声明)和临时值 。 这些寄存器与要执行的字节码数组指针 , 以及该数组中当前字节码的偏移量一起存储在解析器的堆栈框架中:
本文插图
V8 解析器堆栈框架
Sparkplug 会有意创建并维护一个与解析器的框架相匹配的框架布局;只要解析器存储一个寄存器值 , Sparkplug 也会存储一个值 。 这样做有几个原因:
它简化了 Sparkplug 的编译过程;Sparkplug 可以只镜像解析器的行为 , 而无需保留从解析器寄存器到 Sparkplug 状态的某种映射 。
由于字节码编译器完成了分配寄存器的重活儿 , 因此它还加快了编译速度 。
它大大简化了与系统其余部分的集成工作 。 调试器、profiler、异常堆栈展开、堆栈跟踪打印 , 所有这些操作都会执行堆栈遍历以发现当前正在执行的函数堆栈 , 并且所有这些操作都不需要做什么更改就能继续搭配 Sparkplug , 因为就它们而言 , 它们有的只是一个解析器框架 。
它简化了堆栈替换(OSR) 。 OSR 是指在执行过程中替换当前正在执行的函数;当前 , 当一个已解析函数在一个热循环内(在该循环中它升级为优化代码) , 以及在优化代码取消优化(在其降级并继续在解析器中执行该函数)时 , 就会发生这种情况 。 使用 Sparkplug 框架镜像解析器框架时 , 任何适用于解析器的 OSR 逻辑都将适用于 Sparkplug;更棒的是 , 我们可以在解析器和 Sparkplug 代码之间切换 , 而框架转换开销几乎为零 。
我们对解析器堆栈框架做了一个小更改 , 即在 Sparkplug 代码执行期间 , 我们不让字节码偏移保持最新 。 相反 , 我们存储一个从 Sparkplug 代码地址范围到对应的字节码偏移量的双向映射 。 这是一种相对简单的编码映射 , 因为 Sparkplug 代码是直接从字节码上的一个线性遍历发出的 。 每当一个堆栈框架访问想要知道一个 Sparkplug 框架的“字节码偏移量”时 , 我们都会在此映射中查找当前执行的指令 , 并返回相应的字节码偏移量 。 类似地 , 每当我们想将 OSR 从解析器转换为 Sparkplug 时 , 我们都可以在映射中查找当前字节码偏移量 , 然后跳转到相应的 Sparkplug 指令 。
- 医生|全国400余位专家呼吁:脐带血很多优势,科学认识它!
- 数字货币|为什么都抢着搞元宇宙?数字货币未来或会遍及全球,改变世界格局
- 南极|南极磷虾总量十亿吨,全国14亿人齐上阵都吃不完的“海上金矿”?
- 华为|华为跌出全球前五,苹果仅排第二,第一名已是意料之中
- 电子商务|腾讯回应财付通被罚:已全部完成整改
- 高通骁龙|全部配备骁龙778G与5000毫安电池,这三款手机高度‘套娃’
- 纳米|用于长距离、超安全的量子通信的纳米天线
- |新冠“毒王”出现,全球多国紧张,这4个常识你一定要知道
- 三星|德媒:中国或许将成为下一个全球创新总部!
- 微生物|全自动微生物生长曲线分析仪,是我们亲近大自然的垫脚石之一