Zigのビルドが速くなっている
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秒未満でビルドできるというのは驚異的です。現在、私はほとんどの時間をこのライブラリの開発に費やしていますが、Zig 0.15.1にアップグレードしてからのわずか数日でも、ワークフローが大きく変わったことを実感しています。以前はビルドやテストの合間に別のタブでメールを読んだりしていましたが、今はあまりにも速いので、ターミナルに集中したまま作業を続けられます。
この改善は、近い将来に何が起こるかを最もよく示しています。セルフホストのx86_64バックエンドは、すでにデバッグビルドをデフォルトで全てビルドできるほど安定しており、aarch64バックエンドもそこに近づきつつあります。まだGhostty実行ファイル全体をビルドできる段階ではありませんが、この問題も数か月以内に解消されると確信しています。
高速なビルドはすでにここにあります
ご覧のとおり、Zig 0.15.1でGhosttyをビルドすると、あらゆるシナリオで高速化しています。しかも、Ghosttyの多くがまだセルフホストバックエンドの恩恵すら受けられていないにもかかわらずです! そしてインクリメンタルコンパイルがまだ機能していないにもかかわらずです!
GhosttyにZigを採用してきて本当に良かったと思っていますし、コンパイル時間の短縮に注力してくれていることを嬉しく思います。これらの改善は紛れもない現実であり、すでに手元に届いています。そしておそらく数年後には、今日紹介した結果でさえ遅く感じられるようになっているでしょう。😜
脚注
タイムスタンプ付きリンク: https://youtu.be/5eL_LcxwwHg?t=565 ↩
これは、Zigコンパイラのあらゆる側面をより高速に、より並列化しやすくするために費やされた膨大な作業をあえて省略しています。↩
すべての計測は同一のx86_64 Linuxマシンで実施しています。↩
記事をランダムに読む