Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

34
Scalaの コンパイル速度の話 が聞きたいだろう し、するつもりだ VOYAGE GROUP 社内LT大会発表資料

description

(12月5日 追記) 最後のおまけのページにあるDottyはまだコンパイラとしての機能も不足しており、ベンチマークの対象とするにはまだ不適切な感じでした。調査不足な内容を公開してしまい申し分けありませんでした(´・ω・`) VOYAGE GROUPで行なわれた社内LT大会の発表資料です。 Scala Compilerのベンチマークをとってみました。 作業に使ったファイルはこちら => https://github.com/kiris/scalac-benchmarks

Transcript of Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

Page 1: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

Scalaのコンパイル速度の話 が聞きたいだろうし、するつもりだ

VOYAGE GROUP 社内LT大会発表資料

Page 2: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

自己紹介

• @kiris

• 以下略

Page 3: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

今日の内容

Page 4: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

どんなコードが遅いのか?

Page 5: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

なぜ遅いのか?

Page 6: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

どう対処するべきなのか?

Page 7: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

もう一度言う

Page 8: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

Scalaのコンパイル速度の話 が聞きたいだろうし、するつもりだ

Page 9: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

準備はいいね?

Page 10: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

Scalaコンパイルのベンチマークをとってみた話

Page 11: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ベンチマーク環境

Page 12: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ハードウェア

• MacBook Pro Retina, 15-inch, Mid 2014

• 2.8 GHz Intel Core i7

• 16 GB 1600 MHz DDR3

Page 13: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ソフトウェア

• Mac OS X 10.9.5(13F34)

• Java v1.7.0_67 HotSpot(TM) 64-Bit Server VM

• Scala v2.11.4

Page 14: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

使用したツール• svm

• 複数のScalaのバージョン切り替え

• avgtime

• D言語製のシンプルなベンチマークツール

• ruby

• Scalaのコードジェネレータとして

Page 15: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ベンチマーク内容

• コードジェネレートしたコードでベンチマーク

• avgtimeでscalacコマンドを10回実行

• 今日の業務時間中などに実施

Page 16: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ここで問題

Page 17: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

コンパイルに何ミリ秒かかる?

class Class1 class Class2 class Class3 class Class4 class Class5 … class Class2048

Page 18: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

Slackに解答を書いてみよう

Page 19: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

答え

Page 20: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

結果• 平均: 8029ms

• 最小: 7459ms

• 最大: 9059ms

• ちなみに某Scalaプロジェクトは2077 classのファイル

Page 21: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

推移

0ms

4,000ms

8,000ms

12,000ms

16,000ms

20,000ms

1 2 4 8 16 32 64 128 256 512 1024 2048 4096

Page 22: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

推移

0ms

4,000ms

8,000ms

12,000ms

16,000ms

20,000ms

1 2 4 8 16 32 64 128 256 512 1024 2048 4096

2.11.4 2.10.4 2.9.3 2.8.2 final

Page 23: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

いろんなパターン試してみた

Page 24: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ManyWhiteBoxMacros-01024

ManyBlackBoxMacros-01024

ManyMaps-01024

ManyImplicitConversions-01024

ManyAnonymousClasses-01024

ManyTraitsWithTheMethodMixin-01024

ManyImplicitParameters-01024

ManyImplicitValues-01024

ManyObjects-01024

ManyClasses-01024

ManyTraitsMixin-01024

ManyMethods-01024

ManyTypeParams-01024

0ms 10000ms 20000ms 30000ms 40000ms

Page 25: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

遅くなる要因

• Implicitなどの型推論

• 無名クラスの大量生成(ラムダなども含む)

• マクロ ※特に遅い

Page 26: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

詳細を探る

• -verboseオプション

• 各phaseのベンチマークがとれる

• typer(型付け) phaseにコストがかかる印象

• Javaプロファイラ

Page 27: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ではどう対処するべきか?

Page 28: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

金の弾丸

• 札束で殴る

• まず良いCPU、次にSSD

• これだけで大きく改善する

Page 29: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

ツールに頼る• fsc

• JVMの起動が遅い

• sbt

• インクリメンタルコンパイル

• 並列コンパイルも効果あるらしい

• IntelliJ IDEA

• コンパイル回数が圧倒的に減る

Page 30: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

逆に考えるんだ

• ingress

• twitter

• sbt-musical

Page 31: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

コードの最適化は最終手段

Page 32: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

最後におまけ

Page 33: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

福音

Page 34: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ

Dottyめっちゃ早い

• オダスキー先生達が開発中の新Scalaコンパイラ

• 試したら2倍から3倍くらい早くなった

• まだ不完全なのであくまで目安で(́・ω・`)

• 既存のコンパイラの置換えになるかもまだ不明