【问题标题】:Does V8 detect int variables and handle them more efficiently?V8 是否检测 int 变量并更有效地处理它们?
【发布时间】:2012-04-11 05:02:29
【问题描述】:

这更多的是关于使用 V8 引擎的 Node.JS。这是也用于 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 都具有将代码转换为 C 的 JIT 编译器。

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

【问题讨论】:

  • "types are notcoded for variables" -- 您在这里寻找的术语是 dynamically typed(与 相反)静态类型)。见type system

标签: javascript performance variables types v8


【解决方案1】:

一句话:Yes.

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

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

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

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

链接到文章(系列的一部分),详细解释了这一点,更多,绝对值得一读。

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

【讨论】:

  • 虽然您的描述在精神上是正确的,但它包含很多关于 V8 的误导或错误信息。例如:V8 使用一个非优化编译器(不是字节码)编译成机器代码,然后在程序运行时 V8 尝试查看发现的热函数并优化函数粒度(即循环或 if 分支不能单独优化,函数总是作为整体优化[V8可能会或可能不会将无条件反优化插入到没有执行的代码路径中,但这是一个实现技巧])。
  • 我想说这里有三个基本的东西:1)V8 能够在它优化的函数内部执行类型/范围/表示推断 2)V8 能够对类型/范围做出乐观的假设/表示变量和插入检查,当假设不成立时会导致去优化。 3) 全局值编号可以消除和提升检查以最大程度地减少影响。
  • 是的,我确定。优化编译器(又名曲轴)使用两种中间表示:高级一(称为氢)和低级一(称为锂),它们实际上都不是字节码,也没有一个是直接执行和分析的。它们仅用于优化(氢)和代码生成(锂)。在 Crankshaft 启动并优化函数之前或在取消优化函数之后运行的代码由单独的非优化一次性编译器(也称为完整编译器)生成,该编译器不使用任何 IR 并直接从 AST 生成代码。
猜你喜欢
  • 2011-02-28
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多