2011年7月23日土曜日

[scala]簡易的な実行速度測定

scala で書いたコードの実行速度を測定したい場合に使える、簡易的なメソッドを考えたので、そのメモ。 内容は次のような感じです。
def timeOf[A](f: => A): A = {
  val start = System.currentTimeMillis
  val result = f
  val end = System.currentTimeMillis
  println("[Time] %s ms".format(end - start))
  result
}
これを、たとえば適当な package.scala に書いて使えるようにしておけば
scala> timeOf((1 to 100000000).foreach(_ * 2))
[Time] 1067 ms
などというように使えます。
※package.scala は、簡単に説明しますと、あるパッケージで使い回したい変数やメソッドをまとめて定義しておける場所です。こちらのブログなどを参照してください:
Scala 2.8 で追加されたパッケージオブジェクト

上記のように定義すると
val result = timeOf {
  // なんだか長いコード
}
// 以下、result を使った処理
というふうにも書けるので便利かと思います。

scala が標準で用意している scala.testing.Benchmark という trait もありますが、 こちらは mixin したあとに、runメソッドをオーバーライドして、runBenchmark を呼び出す、という手順を挟むので、もう少し気軽に試したいなぁ、と思って書いてみた次第です。あと、Benchmark の場合は、処理実行結果を返してくれませんが、上記のメソッドだと処理結果も使うことができます。また、ソースをみたときに気づいた点として最後に Platform.collectGarbage(= System.gc()) を呼び出しているようです。

実際に scala.testing.Benchmark を使った場合のサンプルは以下のサイトで丁寧に説明されています。
参考:Scala Benchmark

0 件のコメント:

コメントを投稿