什么使预解析函数比完整解析更快?

Mat*_*ert 1 javascript performance parsing v8

为了提高性能 JavaScript 引擎有时只在实际调用函数时才完全解析它们。

例如,来自Spidermonkey源代码:

检查函数的语法比执行完整解析/发出快几倍,当页面包含大量永远不会执行的代码(这种情况经常发生)时,延迟解析可以显着提高性能和内存使用率。

解析器可以跳过哪些步骤,同时仍然能够验证语法?

似乎在 Spidermonkey 中,一些节省来自不发出字节码,例如在完整解析之后。例如 V8 中的完整解析是否还包括生成机器代码?

jmr*_*mrk 5

首先澄清一下:这两个步骤称为“预解析”和“完整解析”。“懒惰解析”描述的是先做前者,然后在需要时再做后者的策略。

预解析更快的两大原因是:

  • 它不构建 AST(抽象语法树),它通常是解析器的输出
  • 它不会对变量进行范围解析。

解析器还有一些其他内部步骤为代码生成做准备,这些步骤仅在检查错误时是不需要的,但以上两个是重点。

(完整)解析和代码生成是单独的步骤。