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

v8 Javascript引擎如何对Int32Array值执行位操作,javascript,performance,bit-manipulation,v8,typedarray,Javascript,Performance,Bit Manipulation,V8,Typedarray,据我所知,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 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位。简单的回答是:这里没有转换,总是对32位整数执行逐位运算,
Int32Array
也将其元素存储为32位整数

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


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

双转换意味着i32->Double->i32,对吗?@D.Pardal抱歉,我还不够清楚。它的意思是:从64位(53位精度)到->32位,再到->64位bit@SerhiiBilyk不,“double->i32->double”毫无意义。该值存储为i32,按位操作发生在i32上。它可能会被转换为介于两者之间的双精度(按照规范的要求),或者转换被优化。类型反馈是否认为HeapNumber和SMI相同,以便范围检查被优化?@Bergi:类型反馈系统单独跟踪SMI,因此,优化编译器可以决定发出HeapNumber处理代码是否有意义。因此,优化编译器将发出避免HeapNumber和双转换的代码,即使在大多数情况下,
1也是如此,这是我所期望的。如果是字面上的
1,我的经验是优化编译器将发出一个“非smi”库。