v8 Javascript 引擎如何对 Int32Array 值执行位操作

How v8 Javascript engine performs bit operations on Int32Array values

据我所知,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 位

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

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

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