0

scalaでベンチマーク

「scalaやclosureはJVM上で動作するから早い」と言われたかと思えば「scalaやclosureはJVM上で動作するから遅い」と言われたりとLL脳の自分には意味が分からない。
という事でjavaもろくに書けないのに少しscalaを触ってみた。
Scala

Scala (スカラ、スカーラ、スケイラ、Scalable Language) はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。

さっぱり意味がわかりませんが、

  • 関数型言語
  • javaの豊富なライブラリが使える
  • インタプリンタ型言語とコンパイル型言語の間の子言語
  • javaのように事前コンパイルして実行することも可能だし、phpのようにインタプリンタ型のように実行させる事も可能(もちろん前者の方が高速に動作する)

ということらしい。

とりあえず、ベンチマークを取るためのコードを書いてみた。

まず、macへのインストールから。
portsがあるのでportsでインストール
最新は2.9らしいが情報が少なかったら怖いので2.8をインストール
sudo port install scala28

シンボリックをはる
# sudo ln -s /opt/local/bin/scala-2.8 /opt/local/bin/scala
# sudo ln -s /opt/local/bin/scalac-2.8 /opt/local/bin/scalac

確認
# scala -version
Scala code runner version 2.8.1.final -- Copyright 2002-2010, LAMP/EPFL

ついでにjavaも確認
# java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

まずは、スクリプト版scala
import java.util.concurrent.TimeUnit
 
def timer() {
for (i <- 1 to 1000000) { // println(i) } }   var startTime = System.nanoTime(); timer() var estimatedTime = (System.nanoTime() - startTime); var microSec = TimeUnit.MICROSECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)   println(microSec)

コンパイル版scala
import java.util.concurrent.TimeUnit
 
object Timer {
def main(args: Array[String]) {
var startTime = System.nanoTime();
for (i <- 1 to 1000000) { // println(i) } var estimatedTime = (System.nanoTime() - startTime); var microSec = TimeUnit.MICROSECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS); println(microSec) } }

比較対象がいるのでphpでも

スクリプト版scala
0.180391sec

コンパイル版scala
0.100856sec

php
0.217540sec

なるほどなるほど。

ただ、体感的にはphpが断トツで早い。
勝手に推測するところではscalaはJVMの起動に時間を要してる気がする。
JVM起動前からベンチを取る方法はないものか。

scalaは思想的にもシンタックス的にもおもしろそうなのでもう少し突き詰めてみよう。

大阪のWEB屋です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です