yuk1ty / learning-systems-programming-in-rust

「Rustでもわかるシステムプログラミング」
433 stars 23 forks source link

ビルド時にキャッシュするフェーズを追加する #88

Closed yuk1ty closed 3 years ago

yuk1ty commented 3 years ago

そろそろ章によってはビルド時間が気になるものが出てきたので、キャッシュしてみたい。Github Actions 素人なので他にいい方法あったらコメントください。

計測

cargo +nightly build -Ztimings

代表的な重そうなものは下記。

tokio

Screenshot 2021-05-15 at 12 04 04

syn

Screenshot 2021-05-15 at 12 04 13

serde

Screenshot 2021-05-15 at 12 04 47

laysakura commented 3 years ago

最近の記事だと https://www.fluvio.io/blog/2021/04/github-actions-best-practices/ が参考になります。 キャッシュに関しては以下の2つのことをやっています。

  1. actions/cache@v2 を使い、 ~/.cargo/registry~/.cargo/git をキャッシュ
    • 誰でもやるやつ
  2. sccache を使う
    • 頑張ってる

自分のプライベートリポジトリ(1.は元々やっていた)でもこれの真似をしてみたのですが、 9分掛かっていたビルドが7分になりました。 まあ確かに速くはなったのですが、頑張って sccache を入れる(そして将来のトラブルの種を撒く)ほどの効果かというと自分としては疑問に思いました。


https://www.fluvio.io/blog/2021/04/github-actions-best-practices/ の記事の貢献はどちらかというと、「lintやらtestのjobでキャッシュとかrustインストールのためのstepがかぶりがちだが、それをmatrixにより共通化する」方法を示したところだと思います。 CircleCIなんかだと普通に commands: 定義したりYAMLのanchor使ったりして直感的に共通化できるのですが、GitHub Actionsはなんとその両方ともできないのです。 matrixによる共通化は思いつかなかったのでここは非常に恩恵を受けました。


ということで、自分としては

がまずやるべきことかと思います。 sccacheは少なくとも今の段階でやらないで良いんじゃないかな 🤔 matrix使った共通化は余力があればやってみるのが良いかと思います(もしやるぞとなって私にアサインくれたらシュッとやることもできます)。

laysakura commented 3 years ago

あ、issueだと思ってコメントしてた 🙄 コードも見ますね。

yuk1ty commented 3 years ago

ありがとうごじます! sccache今の段階でやらないは同意です!w

yuk1ty commented 3 years ago

lint は特に遅くなく build は遅いから、という判断はありだと思います。

rustfmt や clippy は、とくに重いクレートのダウンロードというステップを実行しないのかなーと思ってキャッシュしていませんでした。 ただ、実行時のログを見た限りでは clippy はコンパイルのステップを挟んでいるようだったので、ステップのうちにキャッシュを追加しておきました(気になってコードも読んでみたのですが、clippy は rustc_driver を中で立ち上げているのですね。コンパイルキャッシュがどの程度 Rust で保存されているかについては全然よくわかっておらず、つけてもつけなくても同じかもしれません…)

laysakura commented 3 years ago

自分も「clippyはなんかコンパイルしてるしキャッシュは効きそう」くらいの認識しか持ってませんでした 😮 つけなくても同じ可能性はないとは言い切れませんね... それでもつけておけば良いと思います!