質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.49%

  • Scala

    183questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,611
退会済みユーザー

退会済みユーザー

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/08/13 22:15

    それって、コンパイル速度じゃなくて、実行速度なのでは?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2015/08/13 22:18 編集

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

    キャンセル

  • Stripe

    2015/08/13 22:43

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2015/08/13 22:55

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

    キャンセル

回答 2

checkベストアンサー

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/13 23:30

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

    キャンセル

+1

GroovyServの小技シリーズによると、GroovyServに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.Mainfscの実装クラスだそうです。
watch系ツールと組み合わせると早くコンパイルできそうですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 受付中

    Java 変なエラーが出てきました

    public class hello {   public static void main (String[] args) {     System.out.println("H

  • 解決済

    Java Character.isUpperCase を使わずに表示する。

    質問タイトル通りになるのですが、 こちらのソースをCharacter.isUpperCase を使用せずに表示するやり方がまったく分かりません。 どのように考えたらよろしいでしょう

  • 解決済

    java 北ソフト工房

    java 北ソフト工房なんですが 最後の問題8-4がわかりません dogのところでシンボルが見つかりませんと出ます 解答例から引っ張ってきたものでも通らず なにをどうすればいい

  • 解決済

    paiza.jpの入力に関して

    paizaの問題をといているのですが、pythonの入出力で、入力にはraw_input()を使うと書かれているのでraw_input()を使っているのですが、入力が2つ以上になる

  • 解決済

    javaのコンパイルはできても実行ができない問題【入門】

    classファイルを作りコンパイルはできるのですが、実行ができません 「見つからなかったかロードできませんでした」と表示されます。 class名ファイル名は[a][a.

  • 解決済

    非同期処理 wait,notifyAllの使い方

    import java.util.Collections; import java.util.LinkedList; import java.util.List; import j

  • 解決済

    エラー:メインクラスが見つからないについて

    コマンドプロンプトでコンパイルをすると 以下のようなエラーがでます。 「エラー: メイン・クラス○○が見つからなかったかロードできませんでした」 javac ○○.j

  • 解決済

    Java

    public class Main{ public static void main(String[] args){ System.out.println(

同じタグがついた質問を見る

  • Scala

    183questions

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