首页 > 解决方案 > v8 Javascript 引擎如何对 Int32Array 值执行位操作

问题描述

据我所知,V8 Javascript 引擎进行双数转换(到 i32 并返回)来执行位操作。让我们考虑下一个例子:

const int32 = new Int32Array(2);
int32[0] = 42;
int32[1] = 2;
const y = int32[0] | int32[1];

V8 在这种情况下会进行双重转换吗?如果不是,这是否意味着 Int32Array 值的位操作更快?

更新:通过双重转换,我的意思是:从 64 位(53 位精度)到 -> 32 位,再到 -> 64 位

标签: javascriptperformancebit-manipulationv8typedarray

解决方案


V8 开发人员在这里。简短的回答是:这里没有转换,按位运算总是对 32 位整数执行,并且 anInt32Array也将其元素存储为 32 位整数。

更长的答案是“这取决于”。在未优化的代码中,所有值都使用统一的表示。在 V8 中,这意味着数字值要么表示为“Smi”(“小整数”),如果它们在范围内(包括符号在内的 31 位,即大约 -10 亿到 +10 亿),或者表示为“HeapNumbers”(64 -bit double 带有一个小对象头)否则。因此,对于类似 的元素加载int32[0],从数组加载 32 位值,检查范围,然后标记为 Smi 或装箱为 HeapNumber。以下|操作查看输入,将其转换为 32 位整数(可以像取消标记 Smi 一样简单,也可以像调用.valueOf在一个对象上),并执行按位“或”。然后将结果再次标记为 Smi 或装箱为 HeapNumber,以便下一个操作可以决定如何处理它。

如果函数运行得足够频繁以最终得到优化,那么优化编译器会使用类型反馈(在必要时由类型检查保护)来忽略所有这些在这种情况下不必要的转换,简单的答案就是正确的。


推荐阅读