2010-01-15 20 views
6

मैंने पर निम्न विधि लिखा है तारों से ब्रैकेट में नामस्थान हटा दें।मैं इस विधि को कैसे बढ़ा सकता हूं जो एक स्ट्रिंग से टेक्स्ट हटा देता है?

मैं इसे तेज़ जितना संभव हो उतना बनाना चाहता हूं।

क्या निम्न कोड को गति देने का कोई तरीका है?

using System; 

namespace TestRemoveFast 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] tests = { 
      "{http://company.com/Services/Types}ModifiedAt", 
      "{http://company.com/Services/Types}CreatedAt" 
          }; 

      foreach (var test in tests) 
      { 
       Console.WriteLine(Clean(test)); 
      } 

      Console.ReadLine(); 
     } 

     static string Clean(string line) 
     { 
      int pos = line.IndexOf('}'); 
      if (pos > 0) 
       return line.Substring(pos + 1, line.Length - pos - 1); 
      else 
       return line; 
     } 
    } 
} 
+1

इनमें से कौन सा तेज़ है? लाइन। सब्स्ट्रिंग (pos + 1) बनाम लाइन। सब्स्ट्रिंग (pos + 1, line.Length - pos - 1)। मुझे लगता है कि आपने पहले परीक्षण किया और बाद में चुना ?! –

+3

यह धीमा नहीं है। मेरी विनम्र राय में, RegEx जोड़ना अनावश्यक ओवरहेड होगा। –

+0

आप pos + 1 को एक चर में ले जा सकते हैं, और प्रारंभ और घटाव दोनों के लिए इसका उपयोग कर सकते हैं। लेकिन हम नैनो सेकंड्स बात कर रहे हैं;) लेकिन यह +1 और -1 कर बचाता है। अभी तक नैनोसेकंड के लिए भी। Line.IndexOf ('}') को लाइन में बदलें। इंडेक्सऑफ ('}', 8, लाइन। लम्बाई)। एक विधि कॉल बचाता है और प्रारंभिक बाइट स्कैनिंग करता है। –

उत्तर

3

आप समांतरता का प्रयास कर सकते हैं क्योंकि ऐसा लगता है कि आपको एक तुल्यकालिक उपचार की आवश्यकता नहीं है। PLINQ के साथ समानांतर foreach चाल करेगा।

लेकिन अगर आप जब तक VS2010 आधिकारिक तौर पर बाहर है इंतजार नहीं कर सकता, तो आप Poor Man's Parallel.ForEach Iterator by Emre Aydinceren

+0

+1 समानांतर। ForEach इस उदाहरण के लिए एकदम सही है। – Ian

1

आप Regex के साथ इस की कोशिश की और/या एक स्ट्रिंग के बजाय एक stringbuilder का उपयोग किया है?

+1

क्या आपने इसे प्रोफाइल किया है? मुझे संदेह है कि यह तेज़ है। – jason

-1
अपने foreach के बजाय

की कोशिश कर सकते ...

for(int i=0;i<tests.Length;i++) 
    Console.WriteLine(tests[i].Replace("}",null)); 
+0

क्या यह सिर्फ बंद होने वाली ब्रेस को प्रतिस्थापित नहीं कर रहा है, इससे पहले सबकुछ नहीं? –

+1

हाँ ... मेरा बुरा ... हालांकि, आपके कोड से, आपको लंबाई के लिए सबस्ट्रिंग पर द्वितीयक परम की आवश्यकता नहीं है। यदि आप केवल प्रारंभिक स्थिति की आपूर्ति करते हैं, तो वह उस बिंदु से बाकी सभी स्ट्रिंग वापस कर देगा। – DRapp

1

यदि आप गति अंतरिक्ष के लिए पाश, आप कर सकते हैं एक बार में बदल दिया गया सरणी, और '{। *}' के अलावा अन्य वर्णों की प्रतिलिपि बनाएँ। इससे दो कॉल (IndexOf() और .Substring()) को बचाया जाएगा।

+0

क्या आपने इसे प्रोफाइल किया है? मुझे संदेह है कि यह तेज़ है। – jason

3

दृष्टिकोण तेजी से शांत लगता है। लेकिन आपके पास स्ट्रिंग से, मैंने निष्कर्ष निकाला है कि नाम आमतौर पर {URL} छोटा होता है। आप .LastIndexOf() विधि का उपयोग कर सकते हैं। मुझे लगता है कि यह स्ट्रिंग

+0

मैंने अंतिम इंडेक्स को निकालने के साथ संयुक्त किया और कुछ प्रतिशत लाभ प्राप्त किया, लेकिन केवल तभी जब डिलिमिटर इनपुट स्ट्रिंग के अंत की ओर था। जब मैंने इसे शुरुआत की ओर ले जाया, तो चीजें फिर से धीमी हो गईं। बेशक, यदि वास्तविक डेटा हमेशा इस प्रतिबंध को फिट करता है, तो ओपी इसका लाभ उठा सकता है। –

2

के अंत से शुरू होता है मान लें कि आपको यहां एक जवाब मिल गया है। मुझे लगता है कि आपको इस बात पर विचार करने की ज़रूरत है कि आपके कोड को देखने वाले अगले व्यक्ति के लिए "समाधान" कैसा दिख रहा है।

मैं किसी भी दिन कुछ मिलीसेकंड बनाम अधिक पठनीय कोड ले जाऊंगा।

+0

जब तक आपको प्रति सेकंड कुछ मिलियन रिकॉर्ड संसाधित करने की आवश्यकता न हो। –

+1

@ मैथ्यू व्हिटेड: दिए गए कोड ने 0.0875438 सेकेंड में अपने दयनीय लैपटॉप (http://ark.intel.com/Product.aspx?id=29761) पर 1,000,000 तारों को सफलतापूर्वक संसाधित किया जिसका अर्थ है कि यह एक सेकंड में 11,422,853 को संसाधित कर सकता है। तो, प्रति सेकंड कुछ मिलियन से अधिक। – jason

0

कंसोल। राइटलाइन() तक, वहां तक ​​की सबसे धीमी चीज है। निम्नलिखित उदाहरण लें:

public void TestCleanSpeed() 
    { 
     var start = DateTime.Now; 
     for (var i = 0; i < 10000; i++) 
     { 
      string[] tests = { 
           "{http://company.com/Services/Types}ModifiedAt", 
           "{http://company.com/Services/Types}CreatedAt" 
          }; 

      foreach (var test in tests) 
      { 
       Console.WriteLine(Clean(test)); 
      } 
     } 
     var end = DateTime.Now; 

     var ts = end - start; 
     Console.WriteLine(ts); 
    } 

यदि आप इसे चलाते हैं, तो इसमें लगभग छह सेकंड लगते हैं। फिर, Console.WriteLine को हटाएं और इसके बजाय var newTest = Clean(test); असाइन करें। मेरे परीक्षण में, 10000 निष्पादन के लिए इसमें 0.02 सेकंड लग गए।

+0

'कंसोल। राइटलाइन' अप्रासंगिक है। यह उस 'क्लीन' विधि का भी हिस्सा नहीं है जिसके बारे में उसने पूछा था। – jason

+0

के लिए (var i = 0 .... लूप भी अप्रासंगिक है। मुझे लगता है कि स्ट्रिंग [] परीक्षण की सरणी बड़ी हो सकती है। आप एक अलग परिदृश्य का वर्णन करते हैं। – Johannes

+0

@ जेसन - मैंने पढ़ा "क्या गति करने का कोई तरीका है निम्नलिखित कोड को ऊपर उठाएं? "और मान लिया कि उसका मतलब है कि उसने पोस्ट किया था। मुझे लगता है कि मैंने गलत समझा। –

0

एकमात्र अन्य दृष्टिकोण line.Remove(0, pos + 1); का उपयोग करना होगा, लेकिन मुझे लगता है कि आंतरिक रूप से अधिक जटिल तो सबस्ट्रिंग निकालें, इस तथ्य के कारण, निकालें बीच में कुछ भी कटौती कर सकता है।

तो सबस्ट्रिंग() उपवास होना चाहिए।

0

आप अपनी स्ट्रिंग को XName पर परिवर्तित कर सकते हैं और निम्नानुसार नाम अनुभाग प्राप्त कर सकते हैं।

((System.Xml.Linq.XName)"{http://company.com/Services/Types}ModifiedAt").LocalName 
+1

दिलचस्प, कहीं और इसका उपयोग करने में सक्षम हो सकता है, लेकिन इस उदाहरण में यह लगभग 3 गुना धीमा हो जाता है –

1

क्या आप वाकई अपने कोड में एक बाधा है? इस विधि की समय आवश्यकताओं के लिए आपका विनिर्देश क्या है? क्या आपने यह कोड देखने के लिए अब कोड को प्रोफाइल किया है, चाहे वह उन विनिर्देशों को पूरा करता हो?

मुझे लगता है कि आपके पास जो कोड है वह लगभग इष्टतम है। IndexOf और Substring दोनोंकोड को फैंसी अनुकूलन के सभी प्रकार के लिए आमंत्रित करते हैं जो आपके लिए तब तक उपलब्ध नहीं होंगे जब तक आप unsafe मार्ग भी नहीं जाते।यदि आप ऐसा करते हैं, तो आप अभी भी IndexOf और Substring को फिर से लिखने जा रहे हैं।

तो जब तक यह कोड आपके कोड में निश्चित रूप से बाधा नहीं है और आपके पास इस विधि के लिए समय आवश्यकताओं का उचित विनिर्देश है, तो मैं आपके प्रयासों को कहीं और केंद्रित करूंगा।

0
line.Substring(line.IndexOf('}') + 1); 

मामूली तेज़ी से।

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