Scalaのコンパイル速度を早くするにはどうしたらいいですか?
- 評価
- クリップ 3
- VIEW 2,942

退会済みユーザー
scalac
を使ってHello World
を出力するコードをコンパイルし、時間を測ってみました。
コンパイルしたコードは下記の通り
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
測定コマンドと結果はこちら
[ 10:08PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ time scala hello.scala
Hello, world!
scala hello.scala 0.73s user 0.19s system 20% cpu 4.489 total
Hello Worldを出力するだけで4.5秒か…、と思ってしまうんです。
コンパイル時間はこちら。
[ 10:16PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ time scalac hello.scala
scalac hello.scala 5.47s user 0.27s system 251% cpu 2.281 total
コンパイルで2秒か…、と思ったんですが、もっと早くできませんか?
他のJVM系LLのコンパイルも試してみたよ
GroovyとJRubyのコンパイル速度も比較してみました。どちらともクラスがなくても処理が動くけど、それだと比較しにくいので、クラスも定義しました。
$ groovyc -v
Groovy compiler version 2.4.3
Copyright 2003-2013 The Codehaus. http://groovy.codehaus.org/
[ 10:58PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ cat hello.groovy
public class HelloWorld {
public static void main(String... args) {
print 'Hello World'
}
}
[ 10:58PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ time groovyc hello.groovy
groovyc hello.groovy 0.81s user 0.10s system 155% cpu 0.584 total
$ jruby -v
jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 Java HotSpot(TM) 64-Bit Server VM 25.45-b02 on 1.8.0_45-b14 +jit [darwin-x86_64]
[ 11:01PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ cat hello.rb
class Hello
def self.main
p 'Hello World'
end
end
Hello.main
[ 11:01PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ time jrubyc hello.rb
jrubyc hello.rb 6.77s user 0.37s system 212% cpu 3.360 total
この中だとGroobyが早いっていうのが差なのかもしれない。
Javaだとどうなるか試してみた。
[ 11:52PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ cat HelloWorld.java
public class HelloWorld {
public static void main(String... args){
System.out.println("Hello World!");
}
}
[ 11:52PM ] [ kompiro@kompiro-air-2013:/tmp ]
$ time javac HelloWorld.java
javac HelloWorld.java 1.26s user 0.12s system 161% cpu 0.856 total
んー。やっぱりScalaは複雑なんですね。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
複数のファイルをコンパイルする場合は、scalacの代わりにfscを使うとトータルで速くなります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
- groovyservをインストールする
brew install groovyserv
ここはgvmを使うなどおこのみで。
1. 環境変数SCALA_HOMEを宣言する
$ export SCALA_HOME=/usr/local/Cellar/scala/2.11.6/
2. groovyserverを起動する。この時のCLASSPATHにscalaのライブラリを追加することを忘れないこと
$ CLASSPATH=/usr/local/Cellar/scala/2.11.6/libexec/lib/* groovyserver
3. 対象のソースコードをコンパイルする
$ time groovyclient -Dscala.home=$SCALA_HOME 'scala.tools.nsc.Main.main(args);' -- hello.scala
groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' - 0.00s user 0.00s system 0% cpu 3.712 total
初回は遅いですが、2回目以降は
$ time groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' -- hello.scala
groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' - 0.00s user 0.00s system 0% cpu 0.730 total
$ time groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' -- hello.scala
groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' - 0.00s user 0.00s system 1% cpu 0.561 total
$ time groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' -- hello.scala
groovyclient -Dscala.home=$SCALA_HOME -e 'scala.tools.nsc.Main.main(args);' - 0.00s user 0.01s system 1% cpu 0.636 total
という感じで1秒以下になります。
scala.tools.nsc.Main
はfsc
の実装クラスだそうです。
watch系ツールと組み合わせると早くコンパイルできそうですね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.31%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Stripe
2015/08/13 22:15
それって、コンパイル速度じゃなくて、実行速度なのでは?
退会済みユーザー
2015/08/13 22:18 編集
やらかしました。コンパイル時間も追加しました。ありがとうございます。
Stripe
2015/08/13 22:43
とことで、コンパイル後のclassファイルの実行速度は測定しないんですか?
退会済みユーザー
2015/08/13 22:55
「コンパイルが遅い」ということなので、ファイルの実行速度は扱いません。ごめんなさい。