Zapcc 是一个 缓存型 C++ 编译器 https://www.zapcc.com/ , 基于 Clang/LLVM 的一个分支创建, 据称重编译的速度快 50 倍, 完整构建的速度快 2 到 5 倍. 由 Creemple 开发, 最初在 2015 年底发布, Zapcc 现在 开源 https://github.com/yrnkrn/zapcc 了.
Zapcc 编译速度提升主要是因为使用了一个编译服务器 (zapccs), 该服务器驻留在内存中, 从客户端接收编译命令. Zapccs 仅解析 C++ 头文件一次, 并把所有模板实例和生成的代码都保留在内存中. 在这一方面, 可以把 Zapcc 视为是以更极端的方式使用了预编译的头文件, 但是, 它可以 获得的信息比预编译头文件多得多 https://www.zapcc.com/faq/ , 而且又不需要让预编译头文件发挥作用的所有设置.
在处理十分复杂的 C++ 头文件, 尤其是那些使用了模板的头文件时, 与 Clang 相比, Zapcc 特别快. 因此, 也就不用奇怪, 在构建 boost::math 时 Zapcc 的速度是 Clang 的 40 倍, 在 webKit 完整构建时快 4 倍 https://www.zapcc.com/demo-webkit/ , 在 Clang 完整构建时快 2 倍. 类似地, 在增量重编译时, Zapcc 比 Clang 快 50 倍. 另一方面, 当源文件比头文件复杂很多时, Zapcc 就提供不了多少好处了, 纯 C 项目对于 Zapcc 而言是最坏的情况, 根本就不能提升速度. 实际上, Zapcc 禁止缓存 C 文件.
据 Creemple 介绍, 由 Zapcc 生成的代码其运行时性能和由 Clang 生成的代码一样.
zapccs 使用的内存数量是决定整体性能的一个重要因素. Zapcc 允许开发人员设置内存限值, 当达到限值时, zapccs 会使用一个空的缓存自动重启. 如果找不到可用的服务器实例, 那么 Zapcc 会设法启动一个新的服务器实例, 开发人员可以使用 -j 标识控制并发服务器最大数量. 根据项目的复杂度, 服务器较少而内存限值较高时, Zapcc 可能运行得更快.
据项目主要开发者 Yaron Keren 介绍, Zapcc 是经过重大修改的 Clang http://lists.llvm.org/pipermail/cfe-dev/2015-May/043155.html , 修改超过 20 万行. 我们不认为它有一天会进入 CLang 基线. Zapcc 意在取代 Clang 和 gcc, 其目标是与所有构建系统集成. 它获得了 Linux x64 的完全支持.
来源: http://www.tuicool.com/articles/v2uQR37