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