HeadlinesBriefing favicon HeadlinesBriefing.com

Buildprof Bun コンパイル時間可視化

Hacker News •
×

buildprof(GitHub)を作成しました。Linux でソフトウェアをコンパイルする際の時間がどこに費やされるかを表示するオープンソースのトレースツールです。ripgrep のクリーンビルドのリアルタイムビデオです:buildprof デモを見る。場合によっては、コンパイルが遅いのは単にコンパイルするコードが多いからです。しかし、ほとんどの場合、解決できる問題があります:並列性が悪い、重複した作業、依存関係のダウンロード、または巨大なコンパイラ/リンクコマンド。buildprof はすべてを明確に可視化するので、何が調査と最適化の価値があるかがわかります。既に使用しているあらゆるビルドコマンドの前に buildprof -- を付けて実行します:buildprof -- make -j16, buildprof -- cargo build, buildprof -- ninja -C out/target, buildprof -- just build, buildprof -- ./dev/custom-build-script.sh。buildprof はビルドコマンドが起動したすべてのプロセス、そのサブプロセス(そしてそのサブプロセス…)を記録し、1 つのタイムラインに配置します。時間は左から右へ移動し、バーの幅は所要時間を示し、子プロセスはそれらを起動した親プロセスの下に表示されます。bun JavaScript ランタイムのチーフアーキテクトル、Jarred Sumner のこのツイートが私の頭から離れなかったからです:具体的に、Bun の新しい Rust ビルドが Linux で古い Zig ビルドよりも> 5 倍速いという主張に特に。私の経験では、Zig プロジェクトは同様の複雑さの Rust プロジェクトよりも一般的にコンパイルが速かったです。その直感は enough でした。ミステリーを解く感じがしました。tweet にもう 1 つ重要だが見落とされがちな詳細がありました:Zig ビルドは Full LTO を使用し、Rust ビルドは Thin LTO を使用していました。コンパイラは一般的に分離されたコンパイルユニットを largely 孤立して最適化します。リンク時最適化 (LTO) は、それらの境界をまたって最適化できるようにします。Full LTO はそれらのユニットを 1 つの大きな最適化ジョブにまとめ、Thin LTO はより多くの分離を保ち、多くの作業を並列実行できます。過去の経験から、この違いはビルド時間に enormous な影響を与える可能性があります。tweet はパスに言及しましたが、ヘッドラインの改善のどれくらいが実際にそれを説明しているのか気になりました。数値の再現に試みました。数値は再現されました。では、次は?Bun 1.3.14 と Bun 1.4.0 をチェックし、6 コア、12 スレッドの Linux VM でその Linux x64 CI ビルドを再生するスクリプトを書きました。スクリプトはビルドステップとその依存関係を保存し、1 台のマシンですべて実行しました。私のタイミングは Jarred ののと同じボールパークでした:Linux x64 build Zig era 30m06s、Rust era 5m37s。私の single-machine CI-profile replay 24m24s 5m40s。 OK、なので私のマシンでもギャップが表示されました。しかし、2 回の測定の間には言語以外にも多くの変化があったので、実際に何が原因だったのか気になりました。Zig コンパイラがすべてその余分な時間を費やしていたのか?それとも maybe Full LTO リンク?それとも Bun のビルドで私が考えてもいなかった何か他の何かか? これが私のプロファイリングと開発者ツールの脳が働いたところです。通常、何かが遅い理由を理解しようとするとき、私はトレースが欲しいです:何が起こったか、いつ起こったか、どれくらいかかりました。ビルドに対するトレースを持っているのはとてもクールでしょう。それらをタイムラインに置いて、実際に時間がどこに行ったかを見ることができます。しかし、ビルドは多くの異なるツールで構成されており、それぞれが現在何が起こっているかについて独自の考えを持っています。それらすべてを通して見るために何が記録できるでしょうか?ビルドはプロセスツリーです。cargo build や zig build を実行すると、1 つのプログラムを実行しているように感じられます。ビルドシステムは、何が再構築が必要で、それらの間の順序と何が並列実行できるかを決定します。しかし、一般的に、それはすべての作業自体は行いません;コンパイラ、コードジェネレータ、アーカイバ、リンクランダムスクリプトを起動します。これらはさらにプログラムを起動し、さらにいくつかを起動します… 異なるビルドシステムは、異なる方法でその作業を記述します。Cargo は crates を見、Ninja は build エッジ を見、CMake は別のビルドシステムのための指示を生成します。From the operating