Firefox 是如何又变快起来的
Posted JasonThink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firefox 是如何又变快起来的相关的知识,希望对你有一定的参考价值。
前段时间刚发布的 Firefox Quantum,从内到外都焕然一新。抛弃了一直坚持的 UI 风格、扩展体系和内核架构,Mozilla 可以说是革了自己的命,誓要与 Chrome 再较高低。
这是 Sara Soueidan 为了新版本的 Firefox(Quantum)的推出造势的博文,图文并茂地解释了新版 Firefox 利用 CPU、GPU 进行多层级的并行处理,所以很快。
本人也因为这个小测评, 尝试一下 Quantum, 确实很快, 你也不妨试试。
但同时,抛弃了原有的扩展体系,在丧失了高度定制性优势的同时又难以与其它现代浏览器拉开差距,Firefox 也必然会失去一大批核心用户。壮士断腕能否奏效,还待时间考验。
无论如何,作为一个 Chrome 多年忠实用户,我还是希望 Firefox 能够成功,就像当年颠覆了 IE 霸权一样,让我们在 Google 已经赢得互联网的今天,依然始终有另一个选择。
以下是部分翻译
在过去的7个月里,我们一直在快速更换引擎的主要部件,将 Rust(笔者注:一门语言) 和部分 Servo 引入Firefox。
我们称这个项目为量子,而第一个重生的Firefox Quantum 的通用版本将于明天发布。
但这并不意味着我们的工作已经完成。这并不是说今天的火狐和它的速度一样快。
那么,让我们来看看Firefox是如何快速相应的,以及它将在哪些方面运行的更快。
以粗粒度的并行性奠定基础 为了加快速度,我们需要利用过去10年硬件改变的方式。
我们不是第一个这样做的人。Chrome在第一次推出时比Firefox更快,响应速度也更快。
其中一个原因是,Chrome工程师看到了硬件上的变化,所以他们开始做得更好。
一种新的CPU形式正在流行。这些cpu有多个核心,这意味着它们可以独立地完成任务,但同时也可以并行地完成任务。
这可能有点棘手。有了并行性,您就可以引入一些不易察觉和难以调试的以及难以察觉的bug。例如,如果两个核心需要在内存中添加一个相同的数字,那么如果您不需要特别注意,那么一个可能会覆盖另一个。
避免这类 bug 的一种非常简单的方法就是确保您正在处理的两件事情不需要共享内存——将您的程序分割成相当大的任务,而这些任务不需要太大的协作。
这就是粗粒度的并行性。 在浏览器中,很容易找到这些粗粮。把每个标签作为单独的任务。网页上还有其他的东西——浏览器的颜色——可以单独处理。
通过这种方式,页面可以以自己的节奏同时工作而彼此不影响。如果你一个长时间耗时的后台任务,而不会影响前台的任务。
这就是Chrome工程师所预见的机遇。我们也看到了,但是我们有一条崎岖的路要走。因为我们有一个现成的代码库,所以我们需要计划如何分割代码库以利用多个核心。
虽然我们花了一段时间,但我们最终还是到达了目的。通过 Electrolysis 工程,我们最终使多进程成为所有用户的默认行为。而且,Quantum 已经使我们对粗粒度的并行性的使用变得更好。
Electrolysis
电解为工程量子奠定了基础。它引入了一种类似于Chrome引入的多进程架构。由于这是一个巨大的变化,我们慢慢地引入了它,从2016年起开始测试它的一小部分用户,然后在2017年年中向所有Firefox用户推出。
Quantum Compositor
Quantum Compositor 把合成器移动到它自己的进程中。最大的好处是它使Firefox更加稳定。有一个独立的进程意味着,如果图形驱动程序崩溃,它不会崩溃使所有的Firefox。但是,有了这个单独的进程,Firefox的响应能力也会提高。
Quantum DOM
即使在内核之间分割了内容窗口,并且每个线程都有一个单独的主线程,仍然有许多主要线程需要完成的任务。其中一些比另一些更重要。例如,响应一个按键比运行垃圾收集更重要。Quantum DOM为我们提供了一种对这些任务进行优先排序的方法。这使得 Firefox 更加灵敏。大部分的工作都已经成功了,但是我们仍然计划更进一步,采取先发制人的计划。
利用细粒度的并行性来充分利用硬件
然而,当我们关注未来时,我们需要做的远不止是粗粒度的并行性。
粗粒度的并行性可以更好地利用硬件……但它并不能充分利用它。当您将这些 web 页面划分到不同的内核时,其中一些就没有工作要做了。所以这些核心将会闲置。与此同时,在新内核上启动的新页面,只要CPU是单一核心,就会有同样长的时间。
能够在加载时使用所有这些核心来处理新页面将是一件非常棒的事情。然后你可以更快地完成这项工作。
但是对于粗粒度的并行性,您不能将任何一个工作从一个核心分离到另一个核心。工作之间没有界限。
通过细粒度的并行性,您可以将更大的任务分解成更小的单元,然后将它们发送到不同的内核。例如,如果你有类似 Pinterest 的网站,你可以将不同的固定项目分开,然后将它们发送给不同的内核中。
这不仅有助于提升延迟,像粗粒度的并行性那样的延迟。它也有助于提升速度。页面加载速度更快,因为工作在所有的内核中被分割。当你添加更多的内核时,你的页面加载速度会越来越快,你添加的核心也会越来越多。
所以我们看到这是未来,但还不完全清楚如何去实现。为了使这种细粒度的并行性快速实现,您通常需要在内核之间共享内存。但这又涉及到我之前提到的数据竞争。
但我们知道,浏览器必须做出这样的转变,于是我们开始投资研究。我们创造了一种不受这些数据竞争的语言——Rust。然后我们创建了一个浏览器引擎-Servo,它充分利用了这种细粒度的并行性。通过这一点,我们证明了这是可行的,而且在运行得更快的时候,实际上可以减少bug。
Quantum CSS (aka Stylo)
在Stylo的情况下,CSS样式计算的工作在所有的 CPU 核心上都是完全并行的。Stylo 使用一种称为“工作窃取”的技术,有效地将核心工作分割开,使它们都保持忙碌。有了这个,你就得到了一个线性加速。你可以用你所拥有的许多核心来划分 CSS 样式的计算时间。
Quantum Render (featuring WebRender)
另一个高度并行的硬件是 GPU。它有成百上千个核心。不过,你必须要做很多计划,确保这些核心尽量保持忙碌。这就是 WebRender 所做的事情了。
WebRender 将于2018年登陆,并将利用现代 GPU。与此同时,我们也从另一个角度来改善这个问题。高级层项目修改了 Firefox 现有的层系统以支持批处理。通过优化 Firefox 当前的 GPU 使用模式,它给我们带来了直接的胜利。
我们认为,渲染管道的其他部分也可以从这种细粒度的并行性中受益。在接下来的几个月里,我们将会更仔细地观察我们在哪里可以使用这些技术。
除了我们知道要做的这些主要的架构更改之外,一些性能 bug也会进入到代码库中。
所以我们创建了另一个 Quantum 来解决这个问题。基本上是一个浏览器性能提升问题,它会发现这些问题,并动员团队去修复它们。
明天对我们来说是 Mozilla 的重要日子。在过去的一年里,我们一直在努力推动 Firefox 的快速发展。但这也仅仅是开始。 在接下来的一年里,我们将不断地提供新的性能改进。我们期待着与您分享! 在发布版或开发者版中尝试 Firefox Quantum,以确保在发布时得到最新的更新。
每周至少一篇关于践行的思考,请帮我转发给你身边对此有兴趣的朋友。
点击“原文链接”,可查看我原创的所有践行以及思考类文章,关注后可随时查看。
更多精彩内容请关注:
以上是关于Firefox 是如何又变快起来的的主要内容,如果未能解决你的问题,请参考以下文章
如何制作一个看起来像 Firefox 的“下载”对话框的控件