JavaScript对象代码缓存:这些断言中的哪一个是错误的?

mas*_*onk 15 javascript compiler-construction performance v8

因为我已经在工程师工作了这么多年,我知道如果我不提供背景,我只会得到"你想要完成什么?"形式的一百个答案.我将提供激发我的问题的背景.但是不要混淆我问的问题的背景上下文,这与在语法请求之间使目标代码不可缓存的JavaScript语义特别相关.我不打算就如何更快地使我的webapp提出建议.这与我的问题完全不同,这可能只对那些曾经使用JavaScript编译器或者至少是动态语言编译器的人负责.

背景:

我正在尝试提高Web应用程序的性能.在其众多资源中,它包含一个巨大的JavaScript文件,其中包含40k行和130万个字符的预缩小.后缩小它仍然很大,并且在同步加载时仍然会向window.onload事件添加大约100ms,即使源缓存在客户端也是如此.(我最终排除了通过观察请求日志并观察它没有被请求来缓存资源的可能性.)

在确认缓存后它仍然很慢之后,我开始在主流浏览器中对JavaScript缓存进行一些研究,并且已经了解到它们都没有缓存目标代码.


我的问题是基于这项研究的一些假设断言的形式.如果他们错了,请反对这些断言.

  1. JavaScript对象代码不会在任何现代浏览器中缓存.

    "对象代码"可以表示从表示简单线性化分析树的字节代码到本机机器代码的任何内容.

  2. Web浏览器中的JavaScript对象代码很难缓存.

    换句话说,即使您在外部标记中包含缓存的JS源文件,在页面上包含该脚本也会产生线性成本,即使该脚本仅包含函数定义,因为所有这些源代码都需要被编译成目标代码.

  3. JavaScript对象代码很难缓存,因为必须对JS源进行评估才能进行编译.

    语句能够以动态方式影响下游语句的编译,难以静态分析.

    3A.(3)之所以如此,主要是因为eval().

  4. 评估可能会对DOM产生副作用.

  5. 因此,需要在每个页面请求上编译JavaScript源代码.

奖金问题:任何现代浏览器都会为缓存的JS源文件缓存一个解析树吗?如果没有,为什么不呢?

编辑:如果所有这些断言都是正确的,那么我会给任何可以解释它们为什么是正确的人的答案,例如,提供一个JS代码示例,它不能作为目标代码缓存,然后解释原因不.

我很欣赏有关如何从这里开始使我的应用程序更快的建议,我大多赞同他们.但是我想填补的知识差距与JS对象代码缓存有关.

Nor*_*ard 7

你是对的,它是动态编译和评估的.
你是对的,一定是对的.

你的追索权并不是试图让编译时更小.
它需要在开始时加载较少,为了获得用户体验而做到最低限度,然后尽可能地以模块化方式添加核心功能,然后懒惰(无论是在计时器上,还是按要求由最终用户)加载额外的功能,功能和蓬勃发展.

如果您的程序是10,000行程序代码,那么您就遇到了问题.
我希望它不是全部程序性的.

所以打破它.这意味着第一页负载较慢.但是在随后的请求中,就用户认为"正在运行"而言,它可能意味着更快的响应时间,即使它需要更长的时间才能达到100%的功能.

这完全取决于用户对"速度"和"响应性"的感知,而不是关于100%功能的最短线.

单线程格式的JavaScript不能同时执行此操作具有响应性.
所以要先回应.

PS:添加一个bootstrap.一个聪明的引导.它应该能够辨别出需要哪些功能.
RequireJS用于加载依赖项.
不是要弄清楚你的依赖是什么.

一个额外的好处 - 您可以在引导程序上设置短期缓存,这将指向版本化模块.这有什么好处?好吧,如果您需要更新模块,那么更新引导程序中的版本是一个简单的过程.当引导程序的缓存过期时,它指向新模块,该模块可以具有无限生命周期(因为它具有不同的名称 - 版本化或带时间戳);

  • @masonk为什么浏览器不缓存编译对象图...这在JS中只是常识.随着后期静态绑定(决定什么样的"本"是在最后一刻),以关闭和lambda表达式,对DOM,完全缺乏源地图的依赖......全部加起来上下文可以随时以任何理由在任何页面上进行更改.如果语言没有在运行时编译,它可能会遭受完全一样的命运,Java小程序......其中,有趣的是,失败了,由于其严格的,静态的,从慢到负载的性质. (2认同)