Brave 浏览器用 Rust 重写广告拦截器,内存直降 75%

浏览器开久了风扇狂转,任务管理器一看好几个 G 内存没了。这事儿挺常见。
Brave 的工程师盯上了一个"内存大户":广告拦截器。他们做了一次彻底的内存优化。
广告拦截器为什么这么吃内存?
想象一下,你是一个小区保安,手里有一本"黑名单",上面写着 10 万个不能进小区的人名。
每次有人进门,你都要翻一遍这本名单,看看这人在不在上面。
这就是广告拦截器干的事。
┌─────────────────────────────────────────────────┐
│ 广告拦截器的工作流程 │
├─────────────────────────────────────────────────┤
│ │
│ 网页请求 ──→ 检查 10 万条规则 ──→ 放行/拦截 │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ EasyList │ │
│ │ EasyPrivacy │ │
│ │ uBlock 规则 │ │
│ │ ... 共 10 万+ │ │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────┘
Brave 浏览器默认带着超过 10 万条过滤规则。每条规则都包含匹配模式、选项标志、元数据这些东西。10 万条规则乘起来,还没打开网页呢,光这个"黑名单"就占了 60MB 内存。
Brave 的内存优化方案:Rust + FlatBuffers
Brave 1.85 版本悄悄发布了一个大更新:广告拦截引擎内存占用直降 75%。
不是什么 JavaScript 小技巧,也不是延迟加载的花招。是实打实的底层重构:用 Rust 重写,配合 FlatBuffers 数据格式。这是一次教科书级别的内存优化。
FlatBuffers 是什么?
继续用保安的例子。
以前把黑名单印成厚厚一本书,查人要翻书。FlatBuffers 把名单做成电子索引,输入名字秒出结果。
┌─────────────────────────────────────────────────────────┐
│ 传统方式 vs FlatBuffers │
├─────────────────────────────────────────────────────────┤
│ │
│ 传统方式(JSON/对象): │
│ ┌─────────┐ 解析 ┌─────────┐ │
│ │ 原始数据 │ ─────────→ │ 内存对象 │ ← 占用大量内存 │
│ └─────────┘ └─────────┘ │
│ │
│ FlatBuffers: │
│ ┌─────────┐ 直接读取 ┌─────────┐ │
│ │ 二进制块 │ ─────────→ │ 零拷贝访问│ ← 几乎不占额外内存 │
│ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
FlatBuffers 是 Google 给游戏引擎开发的,那帮人对性能的要求是毫秒级的。核心思路就一个字:不复制。
传统的数据格式,比如 JSON,读进来要先解析,解析完要创建对象,对象要存到堆内存里。一来二去,同样的数据在内存里可能存了好几份。
FlatBuffers 不玩这套。数据存成紧凑的二进制格式,要用的时候直接从原始数据里读,不创建中间对象,不复制数据。
这就是所谓的"零拷贝反序列化"。
为什么要用 Rust?
FlatBuffers 什么语言都能用,为什么选 Rust?内存安全。
浏览器是个高危环境。每天要处理无数来自互联网的数据,稍有不慎就可能被攻击。根据统计,Chrome 70% 的高危漏洞都来自内存安全问题。
C++ 写的代码处理不可信输入,就像让一个粗心的人拿着一把锋利的刀切菜,迟早要出事。
Rust 不一样。它在编译阶段就把内存问题堵死了,运行时又没有垃圾回收的开销。
┌─────────────────────────────────────────────────┐
│ 语言特性对比 │
├─────────────────────────────────────────────────┤
│ │
│ C++: │
│ ├── 性能高 │
│ ├── 内存手动管理 │
│ └── 容易出安全漏洞 │
│ │
│ JavaScript: │
│ ├── 开发快 │
│ ├── 有垃圾回收 │
│ └── 性能一般 │
│ │
│ Rust: │
│ ├── 性能高(和 C++ 一个级别) │
│ ├── 编译期内存安全检查 │
│ └── 无垃圾回收开销 │
│ │
└─────────────────────────────────────────────────┘
对于广告拦截器这种要处理每一个 URL 和网络请求的组件,既要快又要安全,Rust 是目前最好的选择。
内存优化效果
到底省了多少?
┌─────────────────────────────────────────────────┐
│ 优化前后对比 │
├─────────────────────────────────────────────────┤
│ │
│ 内存占用: 60 MB ──→ 15 MB (↓ 75%) │
│ │
│ 内存分配: 减少 19%(使用栈分配替代堆分配) │
│ │
│ 用户体验: 页面加载更流畅,风扇转得更少 │
│ │
└─────────────────────────────────────────────────┘
这次内存优化节省了 75% 的内存:
10 万条规则现在存成一个紧凑的二进制块,Rust 代码直接读取,不创建中间对象。能用栈的地方不用堆,内存分配调用减少了 19%。数据不复制,直接从原始缓冲区读取。
浏览器还没打开网页,就已经省下了 45MB 内存。开一天浏览器,风扇都温和了不少。
为什么这件事值得关注?
浏览器市场现在基本被 Chrome 垄断了。大多数浏览器都是套个 Chromium 的壳,换个皮肤就上架。
Brave 走了另一条路。他们愿意花时间重写底层组件做内存优化,提升安全性。这些东西用户感知不明显,但让浏览体验实实在在变好了。
Brave 还计划把更多组件从 C++ 迁移到 Rust。每次迁移都能带来同样的好处:更低的内存占用,更好的安全性,更少的崩溃。这种内存优化思路值得整个浏览器行业借鉴。
总结一下
FlatBuffers 实现零拷贝,数据直接从二进制块读取。Rust 在编译期检查内存安全,运行时又没有垃圾回收开销。10 万条规则从 60MB 压到 15MB。Brave 这次内存优化给整个行业立了个标杆。
想试试?
Brave 基于 Chromium,Chrome 扩展都能用,但隐私保护和性能优化更用心。它的加密钱包功能有点烦人,界面也有些地方不够精致,但如果你在意内存占用和隐私,值得一试。
你平时用什么浏览器?内存占用怎么样?评论区聊聊。
下一篇说说 Rust 在 Linux 内核和 Android 系统里的应用,看看这门语言是怎么一步步"入侵"整个软件世界的。
文章有用就点个赞,转发给同样被浏览器内存困扰的朋友。关注梦兽编程,不错过更多技术资讯。