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

时间:2017-01-24 09:15:46

标签: javascript performance parsing v8

为了提高性能,JavaScript引擎有时仅在实际调用函数时完全解析函数。

例如,来自Spidermonkey源代码:

  

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

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

似乎在Spidermonkey中,一些节省来自不发送字节码,就像完全解析后一样。完整解析例如V8还包括生成机器代码?

1 个答案:

答案 0 :(得分:4)

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

预解析速度更快的两个重要原因是:

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

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

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