Zigのビルドがどんどん速くなっている
原文は Mitchell Hashimoto により に公開されました。 このブログを購読する
Andrew Kelley氏は(見方によっては有名な、あるいは悪名高い)「コンパイラがクソ遅いからバグが生まれるんだ」と語ったことがあります。1
その結果、Zigの主要な目標の一つとして、長年にわたりコンパイル時間の高速化が掲げられてきました。Zigチームはこれを実現するために極めて困難な課題に取り組んできました(LLVMの排除、独自のコード生成バックエンドの作成、独自のリンカの構築、そして全般的にインクリメンタルコンパイルに向けて着実に前進することなどです)。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秒速くなっています。とはいえ、実際の経過時間(ウォールタイム)でも、この初期ビルド時間の変化ははっきりと確認できます。
重要:この大部分は依然としてLLVMを使用しています。Ghosttyはまだセルフホステッドのx86_64バックエンドだけでは完全にビルド・リンクできない状態で、バックエンドにまだバグがあるためです。したがって、これはLLVMが関与している中でも、Zigコンパイラ自体の全般的な改善を示しているに過ぎません。
Ghosttyがセルフホステッドのx86_64バックエンドを完全に使えるようになれば、この時間は25秒前後、あるいはそれ以下まで急減すると予想しています。Zig 0.14でかかっていた時間のちょうど半分です。
インクリメンタルビルド(Ghostty実行ファイル)
- Zig 0.14: 19sec
- Zig 0.15: 16sec
これは、最も中核的なターミナルエミュレーションのコードに1行の変更を加えた後(エスケープシーケンスパーサにログ関数の呼び出しを1行追加)に、Ghosttyを再ビルドするのにかかる時間です。
このビルドでは、ビルドスクリプトと依存関係グラフは完全にキャッシュされているため、必要な部分だけが再ビルドされます。Zigのインクリメンタルコンパイルはまだ機能していないため、依然としてかなりの量のコードが再コンパイルされます。さらに、前節と同様に、これもまだLLVMを使用しています。LLVMを単純に使わなくするだけで、この時間は12秒前後まで短縮されると見込んでいます(LLVMが出力にかかっている時間の分だけ)。
さらに言えば、Zigがインクリメンタルコンパイルをサポートするようになれば、このようなインクリメンタルビルドは遅くともミリ秒単位で計測できるようになると期待しています。ただ、それが現実になるまでは様子を見ましょう。
インクリメンタルビルド(libghostty-vt)
- Zig 0.14: 2sec 884ms
- Zig 0.15: 975ms
これは、1行変更した後にlibghostty-vtだけを再ビルドするのにかかる時間です。Ghostty本体の実行ファイルとは異なり、libghostty-vtはセルフホステッドのx86_64バックエンドで完全に機能するため、LLVMなしでのビルド時間の違いがここに表れています。
Ghosttyの実行ファイルと同様に、インクリメンタルコンパイルがまだ完全には機能していないため、ここでもlibghostty-vtのZigモジュール全体が再ビルドされています。インクリメンタルコンパイルが実現すれば、これも遅くとも1桁ミリ秒まで短縮されると予想しています。
とはいえ、決して小規模ではないライブラリで1秒を切るビルド時間は驚異的です。これは私が現在ほとんどの時間を費やして取り組んでいるライブラリで、Zig 0.15.1にアップグレードしてからまだ数日ですが、すでにワークフローに大きな違いを感じています。以前はビルドやテストの合間にタブを切り替えてメールを読んだりしていましたが、今ではあまりにも速いので、ターミナル内で集中を途切れさせることなく作業を続けられます。
この改善は、短期的に何が起こるかを最もよく示しています。セルフホステッドのx86_64バックエンドは、すでにデフォルトですべてのデバッグビルドをビルドできるほど安定しており、aarch64バックエンドもそこに近づきつつあります。まだGhosttyの実行ファイル全体をビルドできるわけではありませんが、数か月以内には解決すると見ています。
高速なビルドはすでにここに
ご覧のとおり、Zig 0.15.1でGhosttyをビルドすると、あらゆるシナリオで高速化しています。しかも、Ghosttyの多くの部分がまだセルフホステッドバックエンドの恩恵すら受けられていないにもかかわらず、です! そしてインクリメンタルコンパイルがまだ機能していないにもかかわらず、です!
GhosttyでZigに賭けてきて本当に良かったと思っていますし、彼らがコンパイル時間に注力していることを嬉しく思います。これらの改善は現実のものであり、すでにここにあります。そしておそらく、この先2年もすれば、今日紹介した結果ですらひどく遅く見えるようになるでしょう。😜
脚注
タイムスタンプ付きリンク: https://youtu.be/5eL_LcxwwHg?t=565 ↩
これは、Zigコンパイラのあらゆる側面をより高速に、より並列化しやすくするために費やされた膨大な量の作業を省略しています。 ↩
すべての計測は同一のx86_64 Linuxマシンで行われました。 ↩
記事をランダムに読む
コメント
ログインしてコメントする