代码之家  ›  专栏  ›  技术社区  ›  John MacIntyre

浏览器是否编译和缓存javascript?

  •  2
  • John MacIntyre  · 技术社区  · 16 年前

    我注意到在对javascript文件进行更改、清除缓存并重新加载之后;其中一个函数的运行时间大约为90毫秒,下一次我加载页面时,它的运行时间为40毫秒,下一次我运行它时,它的运行时间为20毫秒,然后再也不会变快。

    看起来IE正在编译我的javascript并在某处缓存编译后的版本,类似于SQLServer处理查询的方式。

    这就是正在发生的事情吗?

    3 回复  |  直到 16 年前
        1
  •  7
  •   Grant Wagner    16 年前

    你可能想退房 Eric Lippert's comment Compiled, interpreted, whatever :

    JScript Classic就像一种编译语言,在任何JScript Classic程序运行之前,我们都会对代码进行完整的语法检查,生成完整的解析树,并生成字节码。然后,我们通过字节码解释器运行字节码。从这个意义上讲,JScript的每一点都和Java一样“编译”。区别在于JScript不允许您持久化或检查我们的专有字节码。此外,字节码的级别比JVM字节码高得多——JScript经典字节码语言只不过是解析树的线性化,而JVM字节码显然是在低级别堆栈机器上运行的。

    这篇帖子和评论是2003年9月发表的,但从拉尔夫·索默尔的评论来看 On JavaScript performance in IE8 在本文中,它们在底层JScript引擎中没有太大变化:

    除非IE(和其他地方)中使用的JavaScript引擎对本机代码进行某种编译,否则它的性能将永远落后于竞争对手。从我在他们家里收集的 Channel9 appearance 他们在字节码执行方面有所改进,但他们的主要目标是JavaScript本机对象(数组、字符串等)和JavaScript DOM交互。

        2
  •  3
  •   Alex Martelli    16 年前

    IE8不是开源的,所以只能做假设;然而,开源浏览器(如Chromium、Firefox、Webkit)的工作原理与您所说的大致相同,其他许多解释器在非浏览器环境下工作,不一定是JS设置(第一次看到或重新加载时编译新的源代码,缓存或保存编译后的版本以便将来更快地执行),因此,IE的Javascript方法应该与您猜测的非常相似,这似乎非常合理。

        3
  •  1
  •   Daniel A. White    16 年前

    我知道你问过IE8,但这里是V8——谷歌的引擎。包括有关V8如何工作的视频。

    http://code.google.com/p/v8/