Javascript V8上是否有类型推断优化?
嗯,另一个优化问题。我想知道V8是否对变量进行类型推断,然后基于该变量优化访问 类型推断如下所示:Javascript V8上是否有类型推断优化?,javascript,v8,Javascript,V8,嗯,另一个优化问题。我想知道V8是否对变量进行类型推断,然后基于该变量优化访问 类型推断如下所示: let input = "keyboard"; // ^^^^^ input is String because "keyboard" is String 在V8上是否存在可能无法推断类型和意外无法对其进行优化的情况,例如,因为某些表达式的类型只能在运行时获得 将zxc放入本地s let s = ''; // let s : String s = zxc; // What is zxc?
let input = "keyboard";
// ^^^^^ input is String because "keyboard" is String
在V8上是否存在可能无法推断类型和意外无法对其进行优化的情况,例如,因为某些表达式的类型只能在运行时获得
将zxc
放入本地s
let s = ''; // let s : String
s = zxc; // What is zxc?
备选方案
let s = '';
s = zxc + '';
是的,绝对是
例如,从2012年开始,V8标记32位数字,因此使用它们进行计算的速度要快得多。证明
曲轴到处引入混合类型推理,以加速未更改类型的每个字段访问
当前的Ignition做得更多更好,当然,它使用字段类型的知识构建本机代码路径
当有人将不可预测类型的值写入已知字段时,它有自己的去优化代价。(这里是V8开发者)。简短的回答是“是和否”。答案很复杂
在let s=''中没有直接的“变量类型推断”代码>示例——正是因为下一个赋值可能是s=1
这就是说,现代JavaScript引擎(V8和其他引擎)如何生成优化代码的基本原则之一是通过观察在程序的特定点上看到了哪些类型。例如,当您有…=s+t
,到目前为止,s
和t
始终是字符串,那么优化后的代码将包含一个大致如下的序列:
check if the value in s is a string, otherwise bail out;
check if the value in s is a string, otherwise bail out;
perform a string concatenation of the two values;
其中,“bail out”表示丢弃整个函数的优化代码,继续执行未优化的代码(或字节码),这不需要对类型进行预处理。基于更新的类型信息,新的优化代码可能会生成,也可能不会生成。不过,这种方法并不是通常所说的“类型推断”
JavaScript中的直接“类型推断”只能在非常有限的情况下实现。例如,按位操作的结果(如|
,&
,
~
)始终是32位整数;一元加号的结果(即+foo
)总是一个数字;将字符串添加到任何其他内容的结果始终是字符串。优化编译器通常会使用这些规则来生成更高效的代码。< / P>也许这包含了你正在寻找的东西。@ Syym几乎…JavaScript都是关于优化快速访问的东西。@丹尼拉。怀特:是的,但是如果编译器没有优化它,那又是什么?JavaScript是一种动态语言,C++是静态的。必须考虑不同的因素。不幸的是,类型标记还没有太大的相关性:/