V8 无符号整型运算

问题描述 投票:0回答:1

当对 js 数字执行按位运算(特别是位移位)时,它们会被强制转换为

int32
,因此理论上它们必须适合 v8 的
smi
(在 jit 之前必须很快,并且很可能在之后),但是当对
uint32
执行相同的操作?

例如

const arr = new Uint32Array([0x1]);
arr[0] = ((arr[0] << 31) >>> 0);
  • v8 是否执行不必要的无符号右移?
  • v8 是否执行像 uint32 => double => int32 => double => uint32 => double => uint32 或类似的类型转换,而不是在 uint32 上执行所有操作?
  • 如果使用标准数组而不是类型化数组会怎样?
javascript v8 jit typed-arrays
1个回答
0
投票

(这里是 V8 开发者。)

它们被转换为

int32
,所以理论上它们必须适合 v8 的
smi

不,Smi 范围是有符号的 31 位整数(在 32 位平台以及指针压缩的 64 位平台上)。这并不妨碍优化编译器使用未标记的 32 位整数值作为本地值(例如中间结果或从类型化数组加载的值)。

v8 是否执行不必要的无符号右移?

不,至少在优化代码中不是。

v8 是否执行像 uint32 => double => int32 => double => uint32 => double => uint32 或类似的类型转换,而不是在 uint32 上执行所有操作?

不,至少在优化代码中不是。

如果使用标准数组而不是类型化数组会怎样?

取决于类型反馈,即数组中的对象/值的类型,和/或已在与该数组所经历的相同源代码位置处处理的数组中的对象/值。标准数组从不存储

uint32
值;它们要么存储通用标记值(即,设置了最高位的结果必须装箱为
HeapNumber
),要么存储双值,因此您将得到
double
->
int32
->
double 
转换。

总而言之,当您使用

Uint32Array
时,给定的代码片段会更加高效。但是,请记住,类型化数组比常规数组具有更多的每个对象开销,因此哪种数组类型总体上是更好的选择取决于应用程序的其余部分,并且不能根据两行代码片段来决定。

© www.soinside.com 2019 - 2024. All rights reserved.