Zig 构建速度正在提升
摘要
Zig 0.15 相比 0.14 在编译时性能有显著提升,构建脚本编译时间从约 7 秒降至约 1.7 秒,完整构建时间从 41 秒降至 32 秒,且仍使用 LLVM。本文重点介绍了自托管后端和增量编译方面的进展。
暂无内容
查看缓存全文
缓存时间: 2026/05/16 03:38
# Zig 构建速度越来越快
来源:https://mitchellh.com/writing/zig-builds-getting-faster
Andrew Kelley 有一句名言(或者说恶名,取决于你的观点):“编译器太慢了,所以我们才有 bug。” (https://mitchellh.com/writing/zig-builds-getting-faster#user-content-fn-1)
因此,多年来 Zig (https://ziglang.org/) 的主要目标之一就是加快编译时间。Zig 团队一直在攻克极其困难的问题来实现这一目标(例如抛弃 LLVM (https://github.com/ziglang/zig/issues/16270)、编写自己的代码生成后端 (https://ziglang.org/download/0.15.1/release-notes.html#Compiler)、构建自己的链接器 (https://github.com/ziglang/zig/pull/25299),并整体迈向增量编译 (https://ziglang.org/download/0.15.1/release-notes.html#Incremental-Compilation))。(https://mitchellh.com/writing/zig-builds-getting-faster#user-content-fn-2)
这些多年努力的成果终于在 Zig 0.15.1 中开始显现。Ghostty (https://ghostty.org/) 项目刚刚完成升级到 Zig 0.15.1,我想分享一些真实的构建时间。(https://mitchellh.com/writing/zig-builds-getting-faster#user-content-fn-3)
---
## 构建脚本编译
- Zig 0.14: 7 秒 167 毫秒
- Zig 0.15: 1 秒 702 毫秒
这是编译 `build.zig` 脚本本身所需的时间。上述时间是通过运行 `zig build --help` 测量的。
编写良好的构建脚本应该很少需要重新编译自身。然而,这是每次新的未缓存源构建(例如,用户下载项目从源码构建一次)都要付出的成本。因此,它直接影响构建可用二进制文件的时间。
---
## 完全未缓存的 Ghostty 二进制文件
- Zig 0.14: 41 秒
- Zig 0.15: 32 秒
这包括构建构建脚本本身的时间。根据前面的结果,Zig 0.15 构建所有其他内容快了约 2 秒。但从墙上时钟时间中仍能看到初始构建时间的变化。
**重要:这里大部分仍然使用 LLVM。** Ghostty 仍然无法完全使用自托管 x86_64 后端构建和链接,因为该后端仍存在 bug。因此,这仅展示了即使在有 LLVM 的情况下,Zig 编译器本身的总体改进。
一旦 Ghostty 可以完全使用自托管 x86_64 后端,我预计这个时间会骤降到 25 秒或更短,仅为 Zig 0.14 所需时间的一半。
---
## 增量构建(Ghostty 可执行文件)
- Zig 0.14: 19 秒
- Zig 0.15: 16 秒
这是在对最核心的终端仿真代码进行一行更改(在转义序列解析器中添加一个日志函数调用)后,重新构建 Ghostty 所需的时间。
此构建具有完全缓存的构建脚本和依赖图,因此只重新构建所需部分。Zig 的增量编译尚未生效,因此这仍然会重新编译相当多的代码。此外,与上一节一样,**这里仍然使用 LLVM**。仅仅去掉 LLVM,我预计这个时间会降到大约 12 秒(减去 LLVM 发射代码的时间)。
更长远来看,一旦 Zig 支持增量编译,我相信像这样的增量构建最坏也能在几毫秒内完成。但让我们拭目以待,看看何时变为现实。
---
## 增量构建(libghostty-vt)
- Zig 0.14: 2 秒 884 毫秒
- Zig 0.15: 975 毫秒
这是在一行更改后仅重新构建 libghostty-vt (https://mitchellh.com/writing/libghostty-is-coming) 所需的时间。与 Ghostty 可执行文件不同,`libghostty-vt` 可以完全使用自托管 x86_64 后端,因此这展示了在没有 LLVM 的情况下的构建时间差异。
与 Ghostty 可执行文件类似,由于增量编译尚未完全生效,这仍然会重新构建 `libghostty-vt` 的完整 Zig 模块。我预计一旦增量编译实现,最坏也会降至个位数毫秒。
但即使如此,对于一个非平凡的库来说,亚秒级构建时间仍然 **惊人**。这是我目前大部分时间都在使用的库,自从升级到 Zig 0.15.1 的短短几天内,我已经感受到了工作流程的巨大变化。以前,我可能会在构建或测试之间切换到另一个标签页去读邮件,但现在速度快到我可以一直保持在终端的流畅状态。
**这一改进最能预示短期内即将到来的变化。** 自托管 x86_64 后端已经足够稳定,可以默认构建所有调试版本,aarch64 后端也正在赶上来。虽然我们还不能构建完整的 Ghostty 可执行文件,但我打赌这个问题会在几个月内解决。
---
## 更快的构建已经到来
如您所见,使用 Zig 0.15.1 构建 Ghostty 在每种场景下都更快,尽管 Ghostty 的很多部分仍然无法利用自托管后端!而且尽管增量编译尚未生效!
我一直钟情于将赌注押在 Zig 上用于 Ghostty,我也很高兴他们专注于编译时间。这些改进是真实的,现在就可以享受到。而且我预计在未来几年内,今天发布的这些结果会显得相当慢。😜
1. 带时间戳的链接:https://youtu.be/5eL_LcxwwHg?t=565 ↩ (https://mitchellh.com/writing/zig-builds-getting-faster#user-content-fnref-1)
2. 这忽略了为使 Zig 编译器的每个方面更快、更具可并行性等而投入的不可估量的工作量。 ↩ (https://mitchellh.com/writing/zig-builds-getting-faster#user-content-fnref-2)
3. 所有测量均在相同的 x86_64 Linux 机器上完成。 ↩ (https://mitchellh.com/writing/zig-builds-getting-faster#user-content-fnref-3)
相似文章
构建系统重构
Zig 构建系统已经重构,将配置器和制造器进程分离,支持缓存、发布模式编译,并且'zig build'命令速度提升高达90%。这一变化提高了性能,并允许构建系统在不减速的情况下增加功能。
Zig ELF 链接器改进开发日志
新的 Zig ELF 链接器现在支持外部库和 C 源码的快速增量编译,在 x86_64 Linux 上能够实现毫秒级重建。
Zig增量编译的内部机制
一位Zig核心团队成员解释了Zig增量编译的内部原理与使用方法,该技术仅重新编译变更的代码并修补到二进制文件中,从而实现毫秒级重建。
我们的Rust到Zig重写进展如何
Roc编译器团队已将他们30万行Rust代码库重写为Zig,经过18个月实现了功能对等,生成了更小的WebAssembly二进制文件并提高了性能。
@bitCast 新语义与 LLVM 后端改进
Zig 语言引入了新的 @bitCast 语义,并通过更改整数降低(integer lowering)来避免编译错误,并更好地与编译器优化对齐,从而改进了其 LLVM 后端。