Zig Builds Are Getting Faster

Mitchell Hashimoto

Zig 的建置愈來愈快

Andrew Kelley(安德魯·凱利)曾說過一句名言(或是惡名昭彰的話,取決於你的觀點):「編譯器慢得要死,這就是我們會有錯誤的原因。」1

因此,多年來 Zig 明確宣示的主要目標之一,就是更快的編譯時間。Zig 團隊為實現這個目標,一直在處理極具挑戰性的難題(例如揚棄 LLVM、撰寫自家的Code Generation Backends(程式碼產生後端)、打造自家的Linkers(連結器),以及整體朝Incremental Compilation(增量編譯)邁進)。2

這份長達多年的努力成果,終於在 Zig 0.15.1 中開始顯現。Ghostty 專案剛完成升級至 Zig 0.15.1,我想分享一些實際的建置時間數據。3


建置指令碼編譯

  • Zig 0.14: 7sec 167ms
  • Zig 0.15: 1sec 702ms

這是建置 build.zig 指令碼本身所需的時間。上述時間是透過執行 zig build --help 測量而得。

撰寫良好的建置指令碼應該很少需要重新建置自己。然而,這是每次全新、未快取的原始碼建置都必須付出的成本(例如使用者下載專案後首次從原始碼建置)。因此,它會直接影響到建置出可用執行檔所需的時間。


完整未快取的 Ghostty 執行檔

  • Zig 0.14: 41sec
  • Zig 0.15: 32sec

這包含了建置建置指令碼本身的時間。根據前面的結果,Zig 0.15 在建置其他所有內容時快了約 2 秒。但是,你仍然可以在實際經過時間(wall time)上看到這次初始建置時間的變化。

重要提醒:其中大部分仍在使用 LLVM。 Ghostty 目前仍無法完全使用 self-hosted x86_64 backend(自託管 x86_64 後端) 來建置與連結,因為該後端仍有錯誤。因此,這僅顯示了 Zig 編譯器本身的整體改進,即使在仍使用 LLVM 的情況下。

一旦 Ghostty 能夠完全使用 self-hosted x86_64 backend,我預期這個時間將會驟降至約 25 秒或更少,僅為使用 Zig 0.14 所需時間的一半。


增量建置(Ghostty 執行檔)

  • Zig 0.14: 19sec
  • Zig 0.15: 16sec

這是在對最核心的終端機模擬程式碼進行一行修改後(在逸出序列解析器中加入一個日誌函式呼叫),重新建置 Ghostty 所需的時間。

這次建置已完整快取了建置指令碼與 Dependency Graph(依賴圖),因此只會重新建置必要的部分。Zig 中的 incremental compilation 尚未實際可用,因此仍會重新編譯相當大量的程式碼。此外,如同前一節所述,這仍在使用 LLVM。光是將 LLVM 排除在外,我預期這個時間就會降至約 12 秒左右(扣除 LLVM 產生程式碼的時間)。

更進一步,一旦 Zig 支援 incremental compilation,我預期這類增量建置最慢也能在數毫秒內完成。不過,就讓我們等著看何時能實現吧。


增量建置(libghostty-vt)

  • Zig 0.14: 2sec 884ms
  • Zig 0.15: 975ms

這是僅在對 libghostty-vt 進行一行修改後,重新建置它所需的時間。與 Ghostty 執行檔不同,libghostty-vt 已可完全透過 self-hosted x86_64 backend 運作,因此這顯示了在沒有 LLVM 參與的情況下,建置時間的差異。

與 Ghostty 執行檔類似,由於 incremental compilation 尚未完全可用,這仍會重新建置 libghostty-vt 的完整 Zig 模組。我預期一旦 incremental compilation 成為現實,這個時間最慢也會降至個位數毫秒。

但即便如此,一個具相當規模的函式庫能在不到一秒內完成建置,已經非常驚人。這是我目前投入最多時間開發的函式庫,即使在升級到 Zig 0.15.1 後短短幾天內,我就已感受到工作流程上的巨大差異。以前,我可能會在建置或測試的空檔切換視窗去收信,但現在速度快到我可以一直待在終端機中保持專注。

這項改進最能預示短期內的未來發展。self-hosted x86_64 backend 已經穩定到足以預設建置所有除錯版本,而 aarch64 backend(AArch64 後端) 也快要達到了。我們目前還無法建置完整的 Ghostty 執行檔,但我猜這個問題會在幾個月內解決。


更快的建置已經到來

如你所見,使用 Zig 0.15.1 建置 Ghostty 在每種情境下都更快,儘管 Ghostty 的許多部分甚至還無法利用 self-hosted backend!而且 incremental compilation 也還尚未可用!

我很慶幸當初選擇以 Zig 來打造 Ghostty,也很喜歡他們專注於編譯時間。這些改進是真實的,而且現在就已經實現了。我猜在接下來的幾年裡,今天公布的這些成果看起來會顯得相當慢。😜

註腳

  1. 附時間戳記的連結:https://youtu.be/5eL_LcxwwHg?t=565

  2. 這忽略了為讓 Zig 編譯器的各個層面變得更快、更具平行化能力等所投入的大量工作。

  3. 所有測量皆在同一台 x86_64 Linux 機器上完成。

原文由 Mitchell Hashimoto 發布

本文章由 muse-spark-1.2-contributor 進行翻譯