【问题标题】:How many times is a web page interpreted until it reaches CPU instructions? [closed]一个网页在到达 CPU 指令之前被解释了多少次? [关闭]
【发布时间】:2021-01-16 11:59:50
【问题描述】:
所以现代网站有很多很多抽象层,我认为这是非常低效的。
假设一个网站是用 React 制作的。
React 将 React 代码(即 jsx bs)解释为 javascript。加上框架本身。那里只有 2 层。
然后浏览器将 javascript 解释成别的东西。但是什么?我很确定不是 CPU 指令,因为那样它就不会那么慢了。
所以我的问题是接下来会发生什么,接下来会发生什么,直到最低级别的 CPU 指令
【问题讨论】:
标签:
performance
cpu
abstraction
processing-efficiency
【解决方案1】:
React 将 React 代码(即 jsx bs)解释为 javascript。加上框架本身。那里只有 2 层。
您忘记了与纯文本之间的转换(例如,具有可接受的错误检测/报告的解析是昂贵的)。转换更像是:
- 纯文本 -> React 的内部表示
- React 的内部表示 -> JavaScript 的内部表示
- JavaScript 的内部表示 -> 纯文本
- 纯文本 -> JavaScript 的内部表示
然后浏览器将 javascript 解释成别的东西。但是什么?
浏览器要么解释代码(如“switch(get_next_token()) { case ... }`,要么(如果尚未缓存)将代码转换为本机机器代码并在下次执行之前缓存结果,或者混合使用两者中的一个(例如,如果一个片段被多次执行,则只转换为原生)。
对于最好的情况(如果一个片段被多次执行,则只转换为原生,如果代码只执行一次,以避免转换和优化的成本)结果仍然很慢,因为它通常适用于小片段和不能花很多时间进行优化,因为语言特性(“duck typing”,eval())几乎不可能将 JavaScript 转换为高性能的本机代码。
我认为这是非常低效的。
是的。然而:
-
HTTP 本身很糟糕(没有“这里有一个很好的清单/您想要的文件列表”,因此浏览器可以在解析 HTML 之前尽早开始获取它们)
-
对于其中的大部分内容(HTML、CSS),与其说“一切都必须是 UTF-8”,不如说每个浏览器都需要支持每种字符编码并在开始解析之前到处进行字符集编码/解码。
-
CSS 的添加意味着浏览器需要 2 个文件而不是 1 个(直到...才知道哪个文件用于 CSS)。
-
HTTP 曾经有缓存,但 Web 开发人员决定一切都必须动态生成并破坏所有代理缓存;所以现在所有东西都必须被拖到世界的一半,而不是来自快速的本地缓存。
-
有人决定对所有内容都进行加密(即使是发送给世界上任何匿名人士而无需登录或安全要求的东西),这样就增加了一堆加密/解密开销。
-
很多网站的商业模式是“让我们把垃圾邮件铲到人们的脸上,假装它是免费的”;导致大量不需要的图形数据被传送(增加互联网成本并降低带宽/速度)和/或导致广告拦截器的额外开销。
换句话说; (对于大多数没有劫持您的浏览器进行比特币挖矿等的网站)React/Javascript 的低效率被其他一切的极端低效率所淹没。 ;-)