• 作成:

StackはGHCやCabalに並列ビルドのjobsオプションを伝えていませんが, 伝えたとしてもGHCの問題で全然速くならない

注意

この記事の内容は既に古くなっています。 GHCの並列ビルドは既に実用的です。 GHCの並列ビルドが実用的になっていました - ncaq を参照してください。

以前の文章

CabalやGHCには-jオプションがあり, ビルド時に並列に処理するかを指示できます.

Stackはパッケージ毎に並列ビルド(依存関係のないパッケージを別々にビルドすること)はCPUのコア数に応じて行います. しかし, パッケージ自体の並列ビルドのオプションはcabalに指定していません.

日々GHCのビルドを待つ我々としては, コンパイル速度は高めたいところです.

これを指定すれば速くなるのではないかと思って調べました.

関連issueが出てきました.

Develop/Document multi-level parallelism policy · Issue #644 · commercialhaskell/stack

なるほどパッケージごとに並列ビルドしながらパッケージ自体を並列ビルドしたらCPUのコア数制限を簡単に突破してしまいますね. しかしそれ自体はシステムの監視などでどうにかなりそうです.

と思ったら興味深いコメントを発見しました. このリンクによると,

#9221 ((super!) linear slowdown of parallel builds on 40 core machine) – GHC

GHCはパラレルビルドを指定しても全く速くならないそうです.

これを見て, 今のプロジェクトでGHCオプション指定して試してみれば良いじゃあないかと気が付きました.

計測結果

  • 指定なし: 1:26.80
  • --ghc-options='-j32': 1:22.80

本当に全然速くならないですね… 誤差レベル.

私のアプリケーションがそんなに並列にしても恩恵が無いというのもあるのでしょうが, これでは並列ビルド対応させても私にはあまり恩恵が無さそうですね.

マイルストーンがGHC 8.6に設定してあるのでこれを期待しましょう.