V8是否检测到int变量并更有效地处理它们?

Bry*_*eld 5 javascript variables performance types v8

这更多是关于使用V8引擎的Node.JS.这是也用于Google Chrome的JavaScript引擎.

我听说V8非常快,不仅适用于Node,也适用于浏览器.但是,我注意到JavaScript的一个原因是类型不是为变量编码的.

要在Java中实现这一点,您需要一个Object变量类型.例如,在for循环中,这将显着降低效率:

for (var i = 0; i < array.length; i++) {}
Run Code Online (Sandbox Code Playgroud)

我的问题是,V8如何处理变量类型?它是否知道这个i变量总是一个int或long?(我认为这不太可能因为i++有能力将a转换long为a double.)

或者V8是否以无关紧要的方式处理事物?我认为JIT编译器将创建的一些简单示例将非常有用.Java和JavaScript都有JIT编译器将代码转换为C.

我不是C程序员,但我很想知道如何处理类型,以及Java在该领域是否真的更有效.(是的,我知道I/O对于大多数程序来说比类型处理更重要)

小智 3

一句话:是的。

V8 将代码编译为中间字节码,然后由“Crankshaft”编译器分析“热点”,如果它确定某些变量永远不会是整数、双精度数、字符串等以外的任何值,则它会生成“未装箱”的机器代码。

它只对已经遍历过的分支执行这种优化;其他的则被推迟,直到“常规”引擎计算出有关实际类型的信息,然后注入优化的代码中。

除此之外,V8 可以将本质上静态的原型层次结构转换为“经典”C++ 风格的对象继承,以提高“复杂”类型的性能。

然而,它只能在称为“经常”的代码上执行所有这些操作;像循环或经常调用的函数。

链接到的文章(系列的一部分)对此进行了非常非常详细的解释,绝对值得一读。

编辑:但是,当然,像 Java 这样的静态类型语言会在编译时优化尽可能多的代码,因此它在除玩具基准测试之外的所有测试中都应该优于 Javascript。然而,V8 正在缩小两者之间的差距,而且 Javascript 比 Java 或 C++ 编写起来“有趣”得多,因此在用户是最大延迟来源的程序的初始原型设计或开发中,Javascript 通常是更好的选择, 在我看来。