javascript - 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 位
解决方案
V8 开发人员在这里。简短的回答是:这里没有转换,按位运算总是对 32 位整数执行,并且 anInt32Array
也将其元素存储为 32 位整数。
更长的答案是“这取决于”。在未优化的代码中,所有值都使用统一的表示。在 V8 中,这意味着数字值要么表示为“Smi”(“小整数”),如果它们在范围内(包括符号在内的 31 位,即大约 -10 亿到 +10 亿),或者表示为“HeapNumbers”(64 -bit double 带有一个小对象头)否则。因此,对于类似 的元素加载int32[0]
,从数组加载 32 位值,检查范围,然后标记为 Smi 或装箱为 HeapNumber。以下|
操作查看输入,将其转换为 32 位整数(可以像取消标记 Smi 一样简单,也可以像调用.valueOf
在一个对象上),并执行按位“或”。然后将结果再次标记为 Smi 或装箱为 HeapNumber,以便下一个操作可以决定如何处理它。
如果函数运行得足够频繁以最终得到优化,那么优化编译器会使用类型反馈(在必要时由类型检查保护)来忽略所有这些在这种情况下不必要的转换,简单的答案就是正确的。
推荐阅读
- python - 从命令提示符调用时,Python 脚本中的 Numpy 无法导入
- git - 有什么方法可以在 git diff 中设置 vim 的颜色列?
- python - 使用 Python 尽可能快地从 Madhava–Leibniz 系列中获得子序列
- c++ - 如何在两个线程之间共享公共资源?
- purescript - 如何直接通过类型构造函数在 Purescript 中创建效果?
- ruby-on-rails - 使用 Activerecord-sqlserver-adapter 的 Activerecord 返回对象列表但没有任何属性
- angular - ngx-datatable angular6中组行标题中的多列
- html - 超过父 div 时,HTML 在新行中显示子 div
- node.js - 我可以通过“npm start”将 IIS 用作开发服务器吗
- javascript - fsExtra.pathExists 和 fsExtra.exists 有什么区别?