🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Q&A

解決済

2回答

4030閲覧

Scalaのコンパイル速度を早くするにはどうしたらいいですか?

退会済みユーザー

退会済みユーザー

総合スコア0

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

0グッド

3クリップ

投稿2015/08/13 13:11

編集2015/08/13 14:54

0

3

scalacを使ってHello Worldを出力するコードをコンパイルし、時間を測ってみました。

コンパイルしたコードは下記の通り

scala

1object HelloWorld { 2 def main(args: Array[String]) { 3 println("Hello, world!") 4 } 5}

測定コマンドと結果はこちら

[ 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のコンパイル速度も比較してみました。どちらともクラスがなくても処理が動くけど、それだと比較しにくいので、クラスも定義しました。

groovy

1 2 $ groovyc -v 3Groovy compiler version 2.4.3 4Copyright 2003-2013 The Codehaus. http://groovy.codehaus.org/ 5 6[ 10:58PM ] [ kompiro@kompiro-air-2013:/tmp ] 7 $ cat hello.groovy 8 9public class HelloWorld { 10 public static void main(String... args) { 11 print 'Hello World' 12 } 13} 14 15[ 10:58PM ] [ kompiro@kompiro-air-2013:/tmp ] 16 $ time groovyc hello.groovy 17groovyc hello.groovy 0.81s user 0.10s system 155% cpu 0.584 total

jruby

1 $ jruby -v 2jruby 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] 3 4[ 11:01PM ] [ kompiro@kompiro-air-2013:/tmp ] 5 $ cat hello.rb 6class Hello 7 def self.main 8 p 'Hello World' 9 end 10end 11 12Hello.main 13[ 11:01PM ] [ kompiro@kompiro-air-2013:/tmp ] 14 $ time jrubyc hello.rb 15jrubyc 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は複雑なんですね。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/08/13 13:15

それって、コンパイル速度じゃなくて、実行速度なのでは?
退会済みユーザー

退会済みユーザー

2015/08/13 13:18 編集

やらかしました。コンパイル時間も追加しました。ありがとうございます。
Stripe

2015/08/13 13:43

とことで、コンパイル後のclassファイルの実行速度は測定しないんですか?
退会済みユーザー

退会済みユーザー

2015/08/13 13:55

「コンパイルが遅い」ということなので、ファイルの実行速度は扱いません。ごめんなさい。
guest

回答2

0

ベストアンサー

コンパイル速度は基本的にどうにもなりません。
複数のファイルをコンパイルする場合は、scalacの代わりにfscを使うとトータルで速くなります。

投稿2015/08/13 14:02

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/13 14:30

ありがとうございます!自分でも調べてみたので、まとめてみます。
guest

0

GroovyServの小技シリーズによると、GroovyServにfscのプロセスをのせたら早くなる、ということでやってみました。

  1. groovyservをインストールする
brew install groovyserv

ここはgvmを使うなどおこのみで。

  1. 環境変数SCALA_HOMEを宣言する
$ export SCALA_HOME=/usr/local/Cellar/scala/2.11.6/
  1. groovyserverを起動する。この時のCLASSPATHにscalaのライブラリを追加することを忘れないこと
$ CLASSPATH=/usr/local/Cellar/scala/2.11.6/libexec/lib/* groovyserver
  1. 対象のソースコードをコンパイルする
$ 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.Mainfscの実装クラスだそうです。
watch系ツールと組み合わせると早くコンパイルできそうですね。

投稿2015/08/13 14:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問