文字列が一致してるかどうかチェックするのにregexとStringのどちらがパフォーマンスがいいか調べる

先だって拡張子mp4で終わるかどうかを調べるのに、Stringの比較で行った。
しかし、Regex使ったほうが綺麗に書けそうである。ということで、Regex使うのとどっちが早いか調べてみたくなった。

こんなソースを書いた。

object cm1 {
  def main(argv: Array[String]) {
      count("Regex", argv(0), func_reg )
      count("String - endWith", argv(0), func_str1 )
      count("String - Substring", argv(0), func_str2 )
  }

  def func_reg(src: String): Unit = {
      val r = """(?i:\.mp4$)""".r
      if (r.findFirstIn(src) != None) {
        println("Found!!")
      }
  }

  def func_str1(src: String): Unit = {
      if (src.toLowerCase.endsWith(".mp4")) {
          println("Found!!")
      }
  }

  def func_str2(src: String): Unit = {
      if (src.substring(src.length-4).toLowerCase == ".mp4") {
          println("Found!!")
      }
  }

  def func1 = {
      for ( i <- 0 until 10) println("hogehoge")
  }

  def count(title: String, param: String, func: (String) => Unit): Unit = {
      println(title)
      val st = java.lang.System.nanoTime()
      func(param)
      println(java.lang.System.nanoTime() - st)
  }
}

// vim: set ts=4 sw=4 et:

結果

$ java cm1 hogehoge111.MP4
Regex
Found!!
43184392
String - endWith
Found!!
266903
String - Substring
Found!!
257493

ということで、大文字小文字変換をしたり、Substringしても、String同士の比較の方が、100倍は早いことがわかった。