क्यों परवाह नहीं करता है रेगेक्स पर इनपुट लंबाई प्रदर्शन को प्रभावित नहीं करती है और यह कैसे संभव है?रेगेक्स स्ट्रिंग लम्बाई
जेनरेट की गई स्ट्रिंग इस तरह है: 128 यादृच्छिक वर्ण। फिर कोष्ठक के अंदर दो संख्याएं। और यह कई बार दोहराया जाता है।
128 radnom characters....(-2435346|45436) 128 radnom characters....(-32525562|-325346)
रेगेक्स को सभी संख्याएं ब्रांड्स के अंदर मिलती हैं। यहां पैटर्न है।
\(([-+]?\d+\|[-+]?\d+)\)
तो मैचों होगा की तरह
-2435346|45436
-32525562|-325346
etc...
यहाँ कोड है कि बेंचमार्क करता है। इनपुट उत्पन्न होने के बाद मैं स्टॉप घड़ी शुरू करता हूं क्योंकि मैं केवल मिलान समय का मूल्यांकन करना चाहता हूं।
Random rand = new Random();
Func<string> getRandString = // generates 128 random characters.
() => Enumerable.Range(0, 128).Select(x => (char) rand.Next()).Aggregate("", (a, b) => a + b);
Func<int> getRandInteger =() => rand.Next(); // generates random number.
string format = "{0}({1}|{2})";
// Generate the big string.
StringBuilder bigstr = new StringBuilder();
for (int i = 0; i < 100; i++) // repeat 100 times.
{
bigstr.Append(string.Format(format, getRandString(), getRandInteger(), getRandInteger()));
}
string input = bigstr.ToString();
Stopwatch stopwatch = Stopwatch.StartNew();
var matches = Regex.Matches(input, @"\(([-+]?\d+\|[-+]?\d+)\)");
stopwatch.Stop();
Console.WriteLine("Time Elapsed :\t{0}\nInputLength :\t{1}\nMatches Count :\t{2}", stopwatch.Elapsed, input.Length, matches.Count);
यह मेरा कंसोल में उत्पादन अगर मैं पाश 10
बार दोहराने है।
Time Elapsed : 00:00:00.0004132
InputLength : 1500
Matches Count : 10
अगर मैं पाश 1000
बार दोहराएँ।
Time Elapsed : 00:00:00.0004373 // seriously?
InputLength : 149937
Matches Count : 1000
यदि मैं लूप 1000000
बार दोहराता हूं।
Time Elapsed : 00:00:00.0004900 // wtf?
InputLength : 149964452
Matches Count : 1000000
स्क्रीनशॉट यदि आपको लगता है
इस आलसी मूल्यांकन किसी तरह का है न? यदि हां तो यह मैचों की गिनती कैसे दिखा सकता है? मैंने डीबगर के तहत यह कैसे किया और मैं मैचों को देख सकता था।
क्या मेरे रेगेक्स पैटर्न में कुछ विशिष्ट है जो इसे तेज़ बनाता है? लेकिन स्ट्रिंग लम्बाई प्रदर्शन को कैसे प्रभावित नहीं करती है? मैं समझ नहीं सकता
कुछ भी विशेष here.Your regex इंजन स्ट्रिंग ट्रेवर्स और सभी कहती है कि आपके regex से मेल खाता बचत होगी है, और आप एक 1000 समय बड़ा स्ट्रिंग जो अब adays machines.Just के लिए एक बड़ी बात नहीं है पर बेंचमार्क हैं की कोशिश बहुत बड़ा तारया शायद आपका बेंचमारिक उचित नहीं है। – Kasramvd
यदि आप .NET regex इंजन द्वारा उपयोग की जाने वाली स्ट्रिंग खोज एल्गोरिदम के बारे में कुछ विवरण देखना चाहते हैं तो आपको [मेरा यह जवाब] [http://stackoverflow.com/a/32618592/3764814) में रुचि हो सकती है। –
उचित बेंचमार्किंग: https://andreyakinshin.gitbooks.io/performancebookdotnet/content/science/microbenchmarking.html –