/ / स्कैला बनाम जावा रेगेक्स मिलान: बड़ा प्रदर्शन अंतर: क्यों? - रेगेक्स, स्कैला, पैटर्न-मिलान

स्कैला बनाम जावा रेगेक्स मिलान: बड़ा प्रदर्शन अंतर: क्यों? - रेगेक्स, स्कैला, पैटर्न-मिलान

किसी को इस स्काला / जावा अंतर को समझाने के लिए अनुरोध करें -

स्कैला पैटर्न मिलान का उपयोग करना

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

रेगेक्स से मेल खाने के लिए जावा का सरल तरीका उपयोग करना -

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 गुणा अंतर है - क्या हो रहा है?

उत्तर:

जवाब के लिए 2 № 1

खैर ... आप शब्द के साथ भ्रमित हो रहे हैं 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

स्केल में, यदि आप 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 ) प्रत्येक पाश में और फिर समय प्रिंट करना, जबकि आपके जावा उदाहरण में आप वास्तव में रेगेक्स पैटर्न मिलान कर रहे हैं। इसलिए आप जावा उदाहरण में काफी समय ले रहे हैं।