2013-04-19 8 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो स्ट्रिंग के माध्यम से पैटर्न की तलाश कर रहा है और इसके कुछ हिस्सों को बदल रहा है। मैंस्ट्रिंग है। स्ट्रिंग में चार की सरणी के माध्यम से चलने से तेज() तेज है?

if (!text.Contains(pattern)) return; 

डालने से अनुकूलित कर सकता है लेकिन, मैं वास्तव में पूरी स्ट्रिंग के माध्यम से चल रहा हूँ और पैटर्न के साथ इसके कुछ हिस्सों की तुलना करें, तो सवाल यह है कि String.Contains() वास्तव में काम करता है, है? मुझे पता है कि ऐसा कोई सवाल था - How does String.Contains work? लेकिन जवाब बल्कि अस्पष्ट है। इसलिए, यदि String.Contains() वर्णों की पूरी सरणी के माध्यम से चलता है और उन्हें पैटर्न के साथ तुलना करता है, तो मैं भी इसके लिए खोज रहा हूं, यह वास्तव में मेरे कार्य को तेज़ नहीं करेगा, बल्कि धीमा होगा।

तो, क्या इस तरह के अनुकूलन का प्रयास करना एक अच्छा विचार है? और - क्या String.Contains() के लिए यह संभव है कि फ़ंक्शन से भी तेज हो जो केवल पूरे सरणी के माध्यम से चलें और प्रत्येक निरंतर एक के साथ प्रत्येक चरित्र की तुलना करें?

यहाँ कोड है:

public static char colorchar = (char)3; 

    public static Client.RichTBox.ContentText color(string text, Client.RichTBox SBAB) 
    { 
     if (text.Contains(colorchar.ToString())) 
     { 
      int color = 0; 
      bool closed = false; 
      int position = 0; 
      while (text.Length > position) 
      { 
       if (text[position] == colorchar) 
       { 
        if (closed) 
        { 
         text = text.Substring(position, text.Length - position); 
         Client.RichTBox.ContentText Link = new Client.RichTBox.ContentText(ProtocolIrc.decode_text(text), SBAB, Configuration.CurrentSkin.mrcl[color]); 
         return Link; 
        } 

        if (!closed) 
        { 
         if (!int.TryParse(text[position + 1].ToString() + text[position + 2].ToString(), out color)) 
         { 
          if (!int.TryParse(text[position + 1].ToString(), out color)) 
          { 
           color = 0; 
          } 
         } 
         if (color > 9) 
         { 
          text = text.Remove(position, 3); 
         } 
         else 
         { 
          text = text.Remove(position, 2); 
         } 
         closed = true; 
         if (color < 16) 
         { 
          text = text.Substring(position); 
          break; 
         } 
        } 
       } 
       position++; 
      } 
     } 
     return null; 
    } 
+0

आपको शेष कोड (एक रूपरेखा) पोस्ट करना होगा। लेकिन हाँ, सबसे अधिक संभावना है कि आप यहां दोहरे काम कर रहे हैं। –

+4

आप लूप में दोनों दृष्टिकोण क्यों नहीं देखते हैं? – Habib

+0

@ हाबीब यह बुरा विचार नहीं है :) – Petr

उत्तर

3

तो string.Contains काफी तेजी से नहीं है, तो यह अत्यधिक संभावना नहीं है कि एक समान विधि के किसी भी अनुकूलन काफी तेजी से किया जाएगा।

सबसे पहले, क्या आप निश्चित हैं कि स्ट्रिंग। क्या वास्तव में पर्याप्त तेज़ नहीं है? मुझे विश्वास करना मुश्किल लगता है जब तक कि आप कुछ बड़े पैमाने पर स्ट्रिंग प्रसंस्करण नहीं कर रहे हैं।

दूसरे, अगर आप इस के बारे में सुनिश्चित कर रहे हैं, तो आप अपने लक्ष्य को प्राप्त करने संभवतः Lucene.Net

तरह अनुक्रमण उपयोगिता के कुछ प्रकार का उपयोग कर
+0

एह, मुझे लगता है कि मेरे प्रश्न में कुछ गड़बड़ है, क्योंकि यह वह नहीं है जिसे मैंने पूछा था .. मेरा मतलब यह नहीं है कि स्ट्रिंग। कंटेनस() पर्याप्त तेज़ नहीं है - मैं जानना चाहता हूं कि इसे मेरे फ़ंक्शन के शीर्ष पर जोड़ने से यह तेज हो सकता है या नहीं (पूरा फ़ंक्शन) क्योंकि मुझे विश्वास है कि मैं वही कर रहा हूं String.Contains() करता है, तो यह दो बार ऐसा होगा – Petr

+0

@Petr यह पता लगाने का सबसे अच्छा तरीका है कि आपका कोड तेज़ हो गया है या नहीं, तो परिवर्तन करना है, फिर इसे प्रोफाइल करें :) – Patashu

+0

वाह, यह बेवकूफ़ है। एक साधारण बॉयर-मूर स्ट्रिंग सर्च एल्गोरिदम 'स्ट्रिंग को बेहतर प्रदर्शन करेगा। बड़े समय में शामिल है। – leppie

0

हाँ के किसी अन्य तरीके से देखने की जरूरत है।

और इसमें कोई बग नहीं है (आह ...)।

बहुत लंबे ग्रंथों में एकाधिक सबस्ट्रिंग की तलाश करने के बेहतर तरीके हैं, लेकिन अधिकांश सामान्य उपयोगों के लिए स्ट्रिंग। कंटेनर (या इंडेक्सऑफ) सबसे अच्छा है।

इसके अलावा IIRC String.Contains के स्रोत नेट साझा सूत्रों

ओह में उपलब्ध है, और अगर आप एक प्रदर्शन की तुलना चाहते हैं तो आप सिर्फ अपने सटीक यूज-केस के लिए माप सकते हैं

0

चेक इस समान पोस्ट How does string.contains work

मुझे लगता है कि आप बस, कुछ भी String.Contains तुलना में तेजी से करने के लिए जब तक आप मानक CRT समारोह wcsstr, msvcrt.dll में उपलब्ध है, जो इतना आसान नहीं है का उपयोग करना चाहते सक्षम नहीं होगा

1

संक्षिप्त उत्तर यह है कि आपका अनुकूलन बिल्कुल अनुकूलन नहीं है।
असल में, String.Contains(...) सिर्फ String.IndexOf(..) >= 0
रिटर्न आप करने के लिए अपने alogrithm सुधार सकता है:

int position = text.IndexOf(colorchar.ToString()...); 
if (-1 < position) 
{ /* Do it */ } 
0

जब तक आप अपने आवेदन प्रोफाइल और निर्धारित किया है कि String.Contains के साथ लाइन एक बोतल-गर्दन है है, तो आप किसी भी ऐसा नहीं करना चाहिए ऐसे समयपूर्व अनुकूलन। अपने कोड के इरादे को स्पष्ट रखने के लिए यह और अधिक महत्वपूर्ण है।

उत्तर में विधियों को लागू करने के कई तरीके हैं।नेट बेस क्लास, आपको लगता है कि डिफ़ॉल्ट कार्यान्वयन अधिकांश लोगों के उपयोग के मामलों के लिए इष्टतम हैं। उदाहरण के लिए, .NET का कोई भी (भविष्य) कार्यान्वयन स्ट्रिंग तुलना के लिए x86- विशिष्ट निर्देशों का उपयोग कर सकता है। सी # में आप जो भी कर सकते हैं उससे हमेशा तेज़ होगा।

यदि आप वास्तव में यह सुनिश्चित करना चाहते हैं कि आपका कस्टम स्ट्रिंग तुलना कोड String.Contains से तेज़ है, तो आपको कई पुनरावृत्तियों का उपयोग करके दोनों को मापने की आवश्यकता है, प्रत्येक एक अलग स्ट्रिंग के साथ। उदाहरण के लिए समय मापने के लिए Stopwatch class का उपयोग करना।

0

यदि अब आप विवरण जो आप अनुकूलन के लिए उपयोग कर सकते हैं (केवल सरल में जांच नहीं है) सुनिश्चित करें कि आप स्ट्रिंग से अपनी विधि को तेज़ी से बना सकते हैं। अन्यथा नहीं।

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