文章摘要
文章介绍了通过利用buildcache的Lua插件系统缓存Firefox的WebIDL绑定代码生成步骤,使Firefox构建速度提升17%。该方法基于已合并的Bug 2027655,通过自定义包装非传统编译器程序来优化构建流程。
文章总结
如何让Firefox构建速度提升17%
本文介绍了通过优化WebIDL绑定代码生成步骤,显著提升Firefox浏览器构建速度的方法。
核心优化点
在Firefox构建过程中,WebIDL绑定代码生成是一个早期步骤,会通过python3 -m mozbuild.action.webidl命令从数百个.webidl文件生成数千个C++绑定文件。虽然该步骤本身耗时不算太长,但由于每次完整构建(clobber build)都会执行,且输出结果完全由输入决定,因此非常适合进行缓存优化。
技术实现
Makefile修改:
- 在
dom/bindings/Makefile.in中添加条件判断,当使用buildcache时,将$(CCACHE)作为命令包装器传递给py_action调用 - 通过
ifdef MOZ_USING_BUILDCACHE判断确保只对buildcache生效
- 在
Lua包装器:
- 利用buildcache的Lua插件系统编写
webidl.lua脚本 - 脚本需要处理三个关键问题:命令匹配、输入文件识别和输出文件识别
- 使用
direct_mode直接哈希输入文件,而非依赖预处理输出
- 利用buildcache的Lua插件系统编写
性能提升
测试数据显示,在Linux系统上进行完整构建时:
| 工具 | 冷缓存 | 热缓存 | 使用插件后 | |------|--------|--------|------------| | 无缓存 | 5分35秒 | - | - | | buildcache | 5分43秒 | 1分27秒 | 1分12秒 |
使用Lua插件后,构建时间进一步缩短15秒,最终达到1分12秒,相比原始构建速度提升了约77%。
配置方法
- 更新到最新版Firefox代码
- 克隆buildcache-wrappers仓库
- 在
~/.buildcache/config.json中配置lua_paths指向包装器目录 - 建议设置较大的缓存大小(如2.5GB)以容纳大型Rust组件
未来展望
这种基于Lua插件的缓存机制可以推广到Firefox构建过程中的其他确定性代码生成步骤,作者计划继续探索更多优化机会。
注:所有测试数据均为单次运行结果,仅供参考趋势方向。
评论总结
总结评论内容:
- 对编译效率提升的肯定
- "wow, 17% is impressive with such an easy fix"(K0IN)
- "Why compile code when ccache faster"(Devorlon)
- 对Mozilla发展策略的质疑
- "perhaps Mozilla should focus on user share dropping"(shevy-java)
- "focusing on that strategy does not really work when dinosaur-like extinction is around the corner"(shevy-java)
- 对构建缓存技术的讨论
- "Can you cache Rust proc-macros?"(mmastrac)
- "Windows builds were ridiculously poor on cache hits rates"(mmastrac)
- 对代码精简的调侃
- "I guess 'purge 17% of the code' is not the correct answer?"(allenrb)