Scala 与 Java 正则表达式匹配:性能差异很大:为什么?
Scala vs. Java Regex matching: Big performance difference: Why?
请人解释这个Scala/Java差异-
使用 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
使用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 倍的差异 - 发生了什么事?
好吧...您对 scala 中的术语 pattern matching
感到困惑。
不是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
在 scala 中,如果你 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.
所以...在您的 Scala 示例中,它只是循环使用 count
,在每个循环中执行一个 if( true )
,然后打印时间,而在您的 Java 示例中,您是实际上在做正则表达式模式匹配。因此,您 Java 示例花费了很多时间。
请人解释这个Scala/Java差异-
使用 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
使用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 倍的差异 - 发生了什么事?
好吧...您对 scala 中的术语 pattern matching
感到困惑。
不是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
在 scala 中,如果你 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.
所以...在您的 Scala 示例中,它只是循环使用 count
,在每个循环中执行一个 if( true )
,然后打印时间,而在您的 Java 示例中,您是实际上在做正则表达式模式匹配。因此,您 Java 示例花费了很多时间。