2015-03-10 4 views
2

Запрос кого-то пожалуйста, объясните это Scala/Java дифференциалом -Scala против соответствия Java Regex: большая разница в производительности: почему?

Использование Scala Pattern Matching

scala> def scalaRegex(count: Int) = { 
| val t1 = System.currentTimeMillis 
| val r_r = "test".r 
| val str = "test" 
| for (i <- 0 to count) { 
| str match { 
|  case r_r => 
| } 
| } 
| val t2 = System.currentTimeMillis 
| val diff = t2 - t1 
| println(t2); println(t1); println(diff) 
| } 
scalaRegex: (count: Int)Unit 

scala> scalaRegex(1000000000) 
1425976261692 
1425976261102 
590 

Использование простой путь в Java, чтобы соответствовать регулярное выражение в -

scala> def javaRegex(count:Int) = { 
| val t1 = System.currentTimeMillis 
| val r_r = "test".r.pattern 
| val str = "test" 
| for (i <- 0 to count) { 
| r_r.matcher(str).matches() 
| } 
| val t2 = System.currentTimeMillis 
| val diff = t2 - t1 
| println(t2); println(t1); println(diff) 
| } 
javaRegex: (count: Int)Unit 

scala> javaRegex(1000000000) 
1425976399868 
1425976335679 
64189 

То есть 100 раз дифференциал - Что происходит?

+1

Guessing: scala компилирует свои регулярные выражения и кэширует скомпилированное регулярное выражение для последующего использования. –

+0

«.pattern» в java-коде (за скайдадок) возвращает * скомпилированный * шаблон. поэтому, сохраняя ссылку на него и повторно используя его в цикле - не так ли считается кешированием в java-программе ...? – Bharadwaj

+0

Вы просто путаетесь с 'pattern matching' в функциональных языках, таких как Scala и' regex pattern matching'. –

ответ

2

Ну ... вы путаете с термином pattern matching в scala.

Это не regex pattern matching.

scala> val regex = "test".r 
regex: scala.util.matching.Regex = test 

scala> val str1 = "test" 
str1: String = test 

scala> val str2 = "qwerty" 
str2: String = qwerty 

scala> str1 match { 
    | case regex => println("yes") 
    | } 
yes 

scala> str2 match { 
    | case regex => println("yes") 
    | } 
yes 

Здесь не существует соответствующего сочетания регулярных выражений.

Это будет работать даже с Int.

scala> val i = 5 
i: Int = 5 

scala> str2 match { 
    | case i => println("yes") 
    | } 
yes 

В Скале, если вы pattern match больше variable case ... он всегда будет соответствовать ... он ведет себя как if(true) на других языках.

scala> val i = 5 
i: Int = 5 

// here str2 can be any valid scala variable... Int, Long, List, String etc... 
scala> str2 match { 
    | case i => println("I will always get printed, irrespective of str2.") 
    | } 
I will always get printed, irrespective of str2. 

Итак ... В вашем примере его просто лестницу зацикливание с count, выполняя if(true) в каждом цикле, а затем печать времени, в то время как в вашем примере Java вы фактически делаете согласование регулярных выражений шаблона. Следовательно, пример Java занимает много времени.

Смежные вопросы