-
Notifications
You must be signed in to change notification settings - Fork 40
uBlock 和 ABP 在运行效率方面的对比
本文从多个角度图文对比两者的运行效率。就像图中唯一的扩展所示,每个扩展都是单独安装测试。基准测试运行于 64 位 Linux Mint 的 Chromium 浏览器。
顺便说一下,在这里我要澄清一个常会出现的荒唐流言,事实上 Adblock Edge 使用的是 Adblock Plus 的过滤引擎,所以它不会比 ABP 更高效。
下面截图显示的是通过一个相当严苛的基准测试之后 ABP 和 uBlock 的内存占用值。一旦完成测试,我会多次点击废纸篓图标(位于开发控制台)来强制浏览器对扩展内存进行垃圾回收 -- 这一步非常重要,因为不这么做的话得出的内存占用值就不太可信。
两个扩展都开启了 EasyList、EasyPrivacy、Peter Lowe's Ad Server 列表和恶意软件防护规则(uBlock 的恶意软件防护规则相比起来还更多)。
最近一次更新时间:2015 年 1月 30 日。
ABP 和 uBlock 需要根据各自的过滤规则库对每个网络请求的 URL 进行判断,以便最终告诉浏览器这些请求取消与否。由于浏览器在等待回应,所以这段时间至关重要,它决定了请求是否会第一时间得到允许。
下面列出了两个扩展使用各自的 chrome.webRequest.onBeforeRequest
处理一条网络请求所花费的平均时间(运行同一个基准测试)。
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 个样本)
µ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 和 uBlock 都开启了 EasyList、EasyPrivacy、"Peter Lowe’s Ad server list" 和 "Malware domains" 规则列表。此外 ABP 关闭了_"可接受的广告"_功能,uBlock 使用的是默认设置。
处理器对测试结果的影响很大,这里我用的是 3.4 GHz 主频的四核 i5-3xxxK CPU。
扩展本身会占用内存,但在打开网页后还会额外占用内存。下面显示的是打开一个非常简单的网页 Hacker News 时增加的内存占用值。第一幅图是不安装任何扩展时所占用的内存,所以可以将它视作该网页所占用内存的参考值。其余两幅图是两个扩展各自额外增加的内存占用。网页载入后浏览器保持空闲状态以便垃圾回收功能自动运行。
不安装扩展:
Adblock Plus:
uBlock:
别忘了这还是打开一个没有任何框架嵌入的简单网页所增加的内存占用值,嵌入了多少个框架就会增加多少倍内存占用,所以有框架嵌入的页面会额外占用大量内存,比如这个 Acid3 的测试页,它在一个非常简单的网页中嵌入了几个 iframe
:
增加的内存占用值:左边是不安装扩展,中间是 Adblock Plus,右边是 uBlock。
这里还有一个著名的 vim 压力测试更能说明情况。
上图大致是用来描述 Adblock Plus 比 uBlock 多占用了多少内存,它显示出 ABP 比起 uBlock 所占用的内存增量 -- 所以基本上 uBlock 就是上图的横轴。如果 ABP 和 uBlock 内存占用完全相同,则不显示任何图形。它也来自我们的参考基准测试,通过在前台同时打开 60 个高流量网页统计内存占用值。
纵轴以 MB 为单位显示内存占用值,横轴是以秒为单位显示时间,而数据是在播放这个视频时提取出的(请将该视频视作原始数据 -- 这是它对应的电子表格文件,有疑问时还可以查看这个文件)。
蓝色区域表示 ABP 本身比起 uBlock 多消耗的内存,而橙色区域表示打开网页后 ABP 多消耗多少内存。ABP 会系统性地导致网页消耗更多内存,在打开某些网站时常常会多达 100MB。这类短期的内存开销也不便宜,也意味着 CPU 需要更高负荷运行。
这是一个通过在后台载入 si.com 10 次来统计 CPU 占用的基准测试(所以如果要按单个网页来算只要将数值小数点左移一位即可)。每个页面都在上一个页面载入完毕后再开始载入。
上面一张图:Adblock Plus 1.8.3 下面一张图:uBlock 0.5.1.0
我也同时测量了运行 content 脚本时的 CPU 占用(上面的测试是后台打开网页),但由于测试所用的页面比较臃肿,无法从大量干扰数据中得出有用的数值。不过实际上 ABP 需要插入 14,000 多条 CSS 规则,这导致 content 脚本的 CPU 占用会达到 uBlock 的 2 到 3 倍(再次重申,上面的测试是后台打开网页时的 CPU 占用)。
同时 uBlock 在运行 content 脚本时的工作量也与网页复杂度成比例。正是因为在打开这么臃肿的网页时 uBlock 都能比 ABP 更高效地使用 CPU,所以这个测试反映的也只是 μBlock 的最差情况,可以说 uBlock 在元素隐藏方面的运行效率是 ABP 的 2 到 3 倍。
uBlock Origin - 一款支持 Chromium、Firefox 和 Safari 的高效过滤工具,快速且简洁