文字列が一致してるかどうかチェックするのに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倍は早いことがわかった。