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

标签 javascript performance variables types v8

这是关于 Node.JS 的更多内容,它使用 V8 引擎。这是也用于 Google Chrome 的 JavaScript 引擎。

我听说 V8 非常快,不仅对于 Node,对于浏览器也是如此。但是,我注意到关于 JavaScript 的一件事是,类型没有针对变量进行编码。

要在 Java 中实现这一点,您需要一个 Object 变量类型来处理所有内容。这在例如 for 循环中的效率会大大降低:

for (var i = 0; i < array.length; i++) {}

我的问题是,V8 如何处理变量类型?它是否知道此 i 变量始终是 intlong? (我认为这不太可能,因为 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/

相关文章:

javascript - 包含外部 javascript 的最佳/最快方法是什么?我使用 jQuery

javascript - 如何停止回显未格式化的 json 数组

javascript - 元素创建后立即触发转换

c# - 为什么与小阵列相比,大阵列的C#SIMD的性能增益较低?

python - 从单独的类访问 Tkinter Canvas

c - 正在初始化未初始化的值?

javascript - Iframe 音频在滚动时淡入淡出

html - HTML 头部中样式表声明的属性顺序差异

ruby-on-rails - Redis hmget 超时

Firefox 扩展中使用的 Javascript 变量