🦀

build.rsを高速化する

2022/12/20に公開

はじめに

build.rsはRustのビルドスクリプトです。Rustコード自体のビルド前にCのライブラリをコンパイルしたり、コード生成したりする際に使用されます。
このbuild.rsですが、デフォルトでは(cargoに --release を付けても付けなくても)必ずデバッグモードでコンパイルされます。
これはbuild.rs自体の最適化に時間をかけるより、build.rsのコンパイル速度を重視しているためだと思われます。例えばCのライブラリをコンパイルするようなケースではbuild.rsがやるのは外部のCコンパイラコマンドの呼び出しだけなので、最適化する必要はほとんどありません。
しかし、build.rs自体がそれなりに重い処理をする場合(たとえば parolLALRPOP のようなパーサジェネレータによる大規模なコード生成)では最適化した方が速い場合があります。
ここではbuild.rsを最適化する場合の設定について紹介します。

設定

Cargo.tomlに以下のように追加するだけです。

Cargo.toml
# デバッグモード時のbuild.rsのオプション
[profile.dev.build-override]
opt-level = 3

# リリースモード時のbuild.rsのオプション
[profile.release.build-override]
opt-level = 3

注意点ですが、ワークスペースで使う場合はこの設定はワークスペースのルートでしか行えません。

実測値

parol によるパーサのコード生成で試した結果です。

build.rs オプション build.rs コンパイル build.rs 実行 合計
デフォルト 6.1s 10.93s 17.03s
opt-level = 3 9.83s 1.56s 11.39s

単純合計でも2倍近く速くなっていますが、実際にはコンパイルキャッシュが効くので、実行時間比で見た10倍速が開発期間の大半で感じられます。

Discussion