这是关于 Node.JS 的更多内容,它使用 V8 引擎。这是也用于 Google Chrome 的 JavaScript 引擎。
我听说 V8 非常快,不仅对于 Node,对于浏览器也是如此。但是,我注意到关于 JavaScript 的一件事是,类型没有针对变量进行编码。
要在 Java 中实现这一点,您需要一个 Object
变量类型来处理所有内容。这在例如 for
循环中的效率会大大降低:
for (var i = 0; i < array.length; i++) {}
我的问题是,V8 如何处理变量类型?它是否知道此 i
变量始终是 int
或 long
? (我认为这不太可能,因为 i++
能够将 long
转换为 double
。)
或者 V8 是否以无关紧要的方式处理事情?我认为 JIT 编译器创建的一些简单示例会很有用。 Java 和 JavaScript 都有 JIT 编译器来将代码转换为 C。
我不是 C 程序员,但我很想知道类型是如何处理的,以及 Java 是否真的在该领域更高效。 (是的,我知道 I/O 对于大多数程序来说比类型处理更重要)
最佳答案
一句话:Yes.
V8 将代码编译成中间字节码,然后“热点”由“Crankshaft”编译器分析,如果它确定某些变量永远不会是整数、 double 、字符串等上,它会生成“未装箱”的机器码。
它只对已经遍历过的分支进行这个优化;其他的被推迟,直到有关实际类型的信息由“常规”引擎计算出来,然后注入(inject)到优化代码中。
除此之外,V8 可以将本质上静态的原型(prototype)层次结构转换为“经典”C++ 风格的对象继承,以提高“复杂”类型的性能。
但是,它只能在被称为“经常”的代码上完成所有这些;例如循环或经常调用的函数。
链接到文章(系列的一部分),对此进行了非常非常详细的解释,非常,绝对值得一读。
编辑:但是,当然,像 Java 这样的静态类型语言会在编译时优化尽可能多的代码,因此它应该在除了玩具基准测试之外的所有方面都优于 Javascript。然而,V8 正在缩小两者之间的差距,并且编写 Javascript 比 Java 或 C++ 更“有趣”,因此用户是最大延迟源的初始原型(prototype)设计或程序开发意味着 Javascript 通常是更好的选择,在我看来。
关于javascript - V8 是否检测 int 变量并更有效地处理它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893361/