JavaScript 对象代码缓存 : which of these assertions are wrong?

标签 javascript performance compiler-construction v8

因为我在工程师身边工作了这么多年,我知道如果我不提供上下文,我只会得到一百个类似“你想完成什么?”的答案。我将给出激发我的问题的背景。但是不要混淆我所问问题的背景上下文,它与使对象代码在 padge 请求之间不可缓存的 JavaScript 语义特别相关。我不会对如何使我的 webapp 更快的建议打分。这与我的问题完全无关,我的问题可能只有从事 JavaScript 编译器或至少是动态语言编译器工作的人才能回答。

背景:

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

在确认缓存后还是很慢之后,我开始研究各大浏览器的JavaScript缓存,了解到它们都没有缓存对象代码。


我的问题是以基于这项研究的一些假设断言的形式提出的。如果它们是错误的,请反对这些断言。

  1. JavaScript 目标代码不会缓存在任何现代浏览器中。

    “目标代码”可以表示从表示简单线性化解析树的字节代码一直到 native machine code 的任何内容。 .

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

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

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

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

    3a。 (3) 之所以成立,主要是因为 eval()。

  4. 求值会对 DOM 产生副作用。

  5. 因此,需要在每次页面请求时编译 JavaScript 源代码。

额外的问题:是否有任何现代浏览器为缓存的 JS 源文件缓存解析树?如果不是,为什么不呢?

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

我很欣赏关于如何从这里开始让我的应用程序更快的建议,我基本同意他们的意见。但我试图填补的知识空白与 JS 对象代码缓存有关。

最佳答案

你是对的,因为它是动态编译和评估的。
你是对的,它一定是。

您的办法不是试图缩短编译时间。
它需要从一开始就减少加载,做最少的事情来让用户体验可见,然后做最少的事情以模块化的方式添加核心功能,然后懒惰地(在计时器上,或按要求)由最终用户)加载额外的特性、功能和繁荣。

如果您的程序有 10,000 行过程代码,那么您就有问题了。
我希望这不是所有程序。

所以分手吧。这意味着第一页加载速度较慢。但在后续请求中,就用户认为“正在运行”而言,这可能意味着更快的响应时间,尽管需要更长的时间才能达到 100% 的功能。

这完全是关于用户对“速度”和“响应能力”的看法,而不是关于达到 100% 功能的最短路线。

单线程格式的 JavaScript 不能既响应。
所以首先要有响应。

PS:添加 Bootstrap 。一个智能 Bootstrap 。 它应该能够辨别需要哪些功能。
RequireJS 用于加载依赖。
不是为了弄清楚您的依赖项是什么。

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

关于JavaScript 对象代码缓存 : which of these assertions are wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497995/

相关文章:

javascript - Okta 设置子域 cookie

python - 如何在 Python sqlite3 中将现有的 db 文件加载到内存中?

mysql - 优化返回数百条记录的 Rails 3.0 查询

ruby - 在 ruby​​ 中定义转换规则的最佳方式是什么?

c - mpi 编译警告隐式声明

java.lang.ArrayIndexOutOfBoundsException : 49 error - NFA Java 异常

javascript - 在 LightningChartJS 中重置轴 CustomTicks

javascript - Javascript 中的引用数据类型和原始数据类型

javascript - 错误 : [ng:areq] Argument 'MainController' is not a function, 在 IE 中未定义

c - R_X86_64_32S 和 R_X86_64_64 重定位是什么意思?