/ / Scala verzus Java Regex matching: Veľký rozdiel vo výkone: Prečo? - regex, scala, párovanie vzorov

Scala vs. Java Regex Matching: Veľký výkonový rozdiel: Prečo? - regex, scala, prispôsobenie vzoru

Požiadajte niekoho o vysvetlenie tohto diferenciálu Scala / Java -

Použitie škálovania vzorov Scala

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

Použitie jednoduchého spôsobu Java na vyrovnanie regulárnych výrazov -

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

To je stokrát rozdiel - čo sa deje?

odpovede:

2 pre odpoveď č. 1

No ... ste zmätení s termínom pattern matching v Scala.

To nieje 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

Nie je tu žiadna regulárna zhoda.

To bude fungovať aj s Int.

scala> val i = 5
i: Int = 5

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

V scala, ak vy pattern match cez variable case... bude sa vždy zhodovať ... správa sa ako if( true ) v iných jazykoch.

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.

Takže ... vo vašom príklade Scala je to len opakovanie count, vykonanie a if( true ) v každej slučke a potom tlačí čas, zatiaľ čo v príklade Java skutočne robíte párovanie regulárnych vzorov. Preto si príklad z jazyka Java vyžaduje veľa času.