Skip to content

uBlock 和 ABP 在运行效率方面的对比

fang5566 edited this page Dec 5, 2023 · 7 revisions

注意:本文内的数据收集于 2015 年,并不是最新的(而打开网页后增加的内存占用值 这段 数据还值得参考)。

所有内容过滤器的代码库这些年已经发生了很大的变化。然而,在近期基准测试中,与拥有类似功能和能力的内容过滤器相比,uBO 在内存和 CPU 效率方面仍然是最出色的。


本文从多个角度图文对比两者的运行效率。每个扩展都是单独安装测试,不启用其他扩展。基准测试运行于 64 位 Linux Mint 的 Chromium 浏览器。

自身内存占用值

下面截图显示的是通过一个相当严苛的基准测试之后 Adblock Plus(ABP)和 uBlock Origin(uBO)的内存占用值。一旦完成测试,我会多次点击废纸篓图标(位于开发控制台)来强制浏览器对扩展内存进行垃圾回收(这一步非常重要,因为不这么做的话得出的内存占用值就不太可信)。

ABP

ABP

uBO

uBlock

两个扩展都开启了 EasyListEasyPrivacyPeter Lowe's Ad Server 列表和恶意软件防护规则(uBO 的恶意软件防护规则相比起来还更多)。

处理网络请求所增加的 CPU 开销

最近一次更新时间:2015 年 1月 30 日。

ABP 和 uBP 需要根据各自的过滤规则库对每个网络请求的 URL 进行判断,并告诉浏览器这些请求取消与否。由于浏览器在等待回应,所以这段时间至关重要,它决定了请求是否会立即得到允许。

下面列出了两个扩展使用各自的 chrome.webRequest.onBeforeRequest 处理一条网络请求所花费的平均时间(运行同一个基准测试)。

ABP 1.8.10
ABP> onBeforeRequest: 0.425 毫秒 (9141 个样本)
ABP> onBeforeRequest: 0.423 毫秒 (9230 个样本)
ABP> onBeforeRequest: 0.423 毫秒 (9233 个样本)
ABP> onBeforeRequest: 0.423 毫秒 (9310 个样本)
ABP> onBeforeRequest: 0.423 毫秒 (9390 个样本)
ABP> onBeforeRequest: 0.423 毫秒 (9477 个样本)
ABP> onBeforeRequest: 0.423 毫秒 (9524 个样本)
ABP> onBeforeRequest: 0.422 毫秒 (9687 个样本)
ABP> onBeforeRequest: 0.421 毫秒 (9704 个样本)
ABP> onBeforeRequest: 0.421 毫秒 (9861 个样本)
uBO 0.8.7.0
µBlock> onBeforeRequest: 0.131 毫秒 (8664 个样本)
µBlock> onBeforeRequest: 0.131 毫秒 (8763 个样本)
µBlock> onBeforeRequest: 0.131 毫秒 (8839 个样本)
µBlock> onBeforeRequest: 0.130 毫秒 (8914 个样本)
µBlock> onBeforeRequest: 0.131 毫秒 (8988 个样本)
µBlock> onBeforeRequest: 0.131 毫秒 (9033 个样本)
µBlock> onBeforeRequest: 0.130 毫秒 (9192 个样本)
µBlock> onBeforeRequest: 0.130 毫秒 (9206 个样本)
µBlock> onBeforeRequest: 0.129 毫秒 (9324 个样本)
µBlock> onBeforeRequest: 0.129 毫秒 (9329 个样本)
测试说明

请注意上述结果都是除了 wait 等待时间设为 15,repeat 重复次数设为 1 以外完整运行参考基准测试后得出的。ABP 和 uBO 都开启了 EasyListEasyPrivacy"Peter Lowe’s Ad server list""Malware domains" 规则列表。此外 ABP 关闭了_“可接受的广告”_ 功能,uBO 使用的是默认设置。

处理器对测试结果的影响很大,这里我用的是 3.4 GHz 主频的四核 i5-3xxxK CPU。

打开网页后增加的内存占用值

扩展本身会占用内存,但在打开网页后还会额外占用内存。下面显示的是打开一个非常简单的网页,例如 Hacker News 时增加的内存占用值。第一幅图是不安装任何扩展时所占用的内存,所以可以将它视作该网页所占用内存的参考值。其余两幅图是两个扩展各自额外增加的内存占用。网页载入后浏览器保持空闲状态以便垃圾回收功能自动运行。

不安装扩展:
无扩展

ABP:
ABP

uBO:
uBlock

别忘了这还是打开一个没有任何框架嵌入的简单网页所增加的内存占用值,嵌入了多少个框架就会增加多少倍内存占用,所以有框架嵌入的页面会额外占用大量内存,比如这个 Acid3 的测试页,它在一个简单的网页中嵌入了几个 iframe

uBlock
增加的内存占用值:左边是不安装扩展,中间是 ABP,右边是 uBO。

这里还有一个著名的 vim 压力测试更能说明情况。

uBO 和 Adblock 在参考基准测试中的内存占用值对比

uBlock 和 Adblock 在参考基准测试中的内存占用值对比

上图显示了 ABP 比 uBO 多占用了多少内存,它显示出 ABP 比起 uBO 所占用的内存增量 -- 所以基本上 uBO 就是上图的横轴。如果 ABP 和 uBO 内存占用完全相同,则不显示任何图形。它也来自我们的参考基准测试,通过在前台同时打开 60 个高流量网页统计内存占用值。

纵轴以 MB 为单位显示内存占用值,横轴是以秒为单位显示时间,而数据是在播放这个视频时提取出的(请将该视频视作原始数据 -- 这是它对应的电子表格文件,有疑问时还可以查看这个文件)。

蓝色区域表示 ABP 本身比起 uBlock 多消耗的内存,而橙色区域表示打开网页后 ABP 多消耗多少内存。ABP 会系统性地导致网页消耗更多内存,在打开某些网站时常常会多达 100MB。这类短期的内存开销也不便宜,也意味着 CPU 需要更高负荷运行。

打开网页后增加的 CPU 开销

这个基准测试通过在后台载入 si.com 10 次来统计 CPU 占用(所以如果要按单个网页来算只要将数值小数点左移一位即可)。每个页面都在上一个页面载入完毕后再开始载入。

上面一张图:ABP 1.8.3 下面一张图:uBO 0.5.1.0

CPU 基准测试

注意:我测量了运行内容脚本时的 CPU 占用(上面的测试是后台打开网页),但由于测试所用的页面比较臃肿,无法从大量干扰数据中得出任何信息。不过实际上 ABP 需要插入 14,000 多条 CSS 规则,这导致内容脚本的 CPU 占用会达到 uBO 的 2 到 3 倍(再次重申,上面的测试是后台打开网页时的 CPU 占用)。

同时 uBO 在运行内容脚本时的工作量也与网页复杂度成比例。虽然在打开这么臃肿的网页时 uBO 都能比 ABP 更高效地使用 CPU,但这个测试反映的也只是 uBO 的最差情况,可以说 uBO 在元素隐藏方面的运行效率是 ABP 的 2 到 3 倍。

相关维基页面

Clone this wiki locally