2013-05-19 11 views
10

जब मैं स्ट्रिंग परिचालन पर Regex का उपयोग करना चाहिए और इसके विपरीत केवल प्रदर्शन के बारे में?तेज़ क्या है: रेगेक्स या स्ट्रिंग ऑपरेशंस?

+3

एक सरल जवाब के साथ सरल सवाल। यदि आप प्रदर्शन को अनुकूलित करना चाहते हैं, तो बेहतर प्रदर्शन करने वाले विकल्प का चयन करें। –

उत्तर

15

यह

निर्भर करता है हालांकि स्ट्रिंग परिवर्तन आमतौर पर कुछ हद तक तेजी से हो जाएगा, वास्तविक प्रदर्शन भारी एक संख्या पर निर्भर कारकों में से:

  • कितनी बार आप regex पार्स
  • कैसे चतुराई से आप अपने स्ट्रिंग कोड
  • चाहे regex precompiled है लिखने

regex और अधिक जटिल हो जाता है, यह बहुत अधिक प्रयास ले जाएगा और समरूपता स्ट्रिंग मैनिपुलेशन कोड लिखने के लिए जटिलता जो अच्छी तरह से प्रदर्शन करती है।

4

मैं दो कार्यों FunctionOne (स्ट्रिंग आपरेशन) और FunctionTwo (Regex) कहा जाता है के साथ कुछ मानक किया है। उन्हें दोनों '<' और '>' के बीच सभी मैच मिलना चाहिए।

बेंचमार्क # 1:

  • बार कहा जाता है: 1'000'000
  • इनपुट: 80 अक्षर
  • अवधि (स्ट्रिंग आपरेशन // FunctionOne): 1.12 सेकंड
  • अवधि (regex ऑपरेशन // FunctionTwo): 1.88 सेकंड

बेंच rk # 2:

  • बार कहा जाता है: 1'000'000
  • इनपुट: 2000 वर्ण
  • अवधि (स्ट्रिंग आपरेशन): 27.69 सेकंड
  • अवधि (regex संचालन): 41.436 सेकंड

निष्कर्ष: स्ट्रिंग आपरेशन लगभग हमेशा, नियमित अभिव्यक्ति को हरा अगर कुशलता से प्रोग्राम किया जाएगा। लेकिन और अधिक जटिल यह हो जाता है, यह कठिन हो सकता है कि स्ट्रिंग आपरेशन प्रदर्शन के मामलों में न केवल लेकिन यह भी रखरखाव के बारे में रख सकते हैं।

कोड FunctionOne

private void FunctionOne(string input) 
     { 
       var matches = new List<string>(); 
     var match = new StringBuilder(); 
     Boolean startRecording = false; 
     foreach (char c in input) 
     { 
      if (c.Equals('<')) 
      { 
       startRecording = true; 
       continue; 
      } 

      if (c.Equals('>')) 
      { 
        matches.Add(match.ToString()); 
        match = new StringBuilder(); 
        startRecording = false; 
      } 

      if (startRecording) 
      { 
       match.Append(c); 
      } 
     } 
     } 

कोड FunctionTwo

Regex regx = new Regex("<.*?>"); 
private void FunctionTwo(string input) 
    { 
     Match m = regx.Match(input); 
     var results = new List<string>(); 
     while (m.Success) 
     { 
      results.Add(m.Value); 
      m = m.NextMatch(); 
     } 
    } 
+7

वास्तविक उत्तर यह है कि यह निर्भर करता है कि आप क्या कर रहे हैं, कैसे, और कितनी बार – SLaks

+7

आपका रेगेक्स बेंचमार्क बहुत गलत है; आप हर बार regex फिर से संकलित कर रहे हैं। यदि आप एक उदाहरण का पुन: उपयोग करते हैं, तो यह बहुत तेज हो जाएगा। यदि आप 'RegexOptions.Compiled' पास करते हैं, तो यह और भी तेज़ हो जाएगा। – SLaks

+0

ठीक है धन्यवाद स्लाक्स, मैं यहां अपने नए परिणाम पोस्ट करूंगा। –

3

स्ट्रिंग आपरेशन हमेशा नियमित अभिव्यक्ति के संचालन की तुलना में तेजी हो जाएगा। बेशक, आप स्ट्रिंग ऑपरेशंस को एक अक्षम तरीके से लिखते हैं।

नियमित अभिव्यक्तियों को पार्स किया जाना चाहिए, और स्ट्रिंग ऑपरेशन का उपयोग करके ऑपरेशन करने के लिए उत्पन्न कोड। सबसे अच्छा, नियमित अभिव्यक्ति ऑपरेशन स्ट्रिंग मैनिप्लेशंस करने के लिए इष्टतम क्या कर सकता है।

नियमित अभिव्यक्तियों का उपयोग नहीं किया जाता है क्योंकि वे सादे स्ट्रिंग ऑपरेशंस की तुलना में कुछ भी तेज़ कर सकते हैं, इसका उपयोग किया जाता है क्योंकि यह छोटे कोड के साथ बहुत जटिल परिचालन कर सकता है, उचित रूप से छोटे ओवरहेड के साथ।

1

मैं एक समय पहले सी # में कुछ रूपरेखा किया था, निम्नलिखित की तुलना:

1) वस्तुओं के लिए LINQ।

2) लैम्ब्डा अभिव्यक्तियां।

3) पारंपरिक पुनरावृत्ति विधि।

सभी 3 तरीकों का नियमित अभिव्यक्तियों के साथ और बिना दोनों परीक्षण किए गए थे। मेरे परीक्षण मामले में निष्कर्ष स्पष्ट था कि बड़ी संख्या में पाठ में तारों की खोज करते समय नियमित अभिव्यक्तियां सभी 3 मामलों में गैर-रेगेक्स की तुलना में काफी धीमी होती हैं।

आप अपने ब्लॉग पर विवरण पढ़ सकते हैं: http://www.midniteblog.com/?p=72

संबंधित मुद्दे