दिलचस्प पोस्ट
`स्तर <-` (यह क्या जादू है? Piv.xml को ivy.xml कन्वर्ट करें मैं किसी को जीआईटी रिपॉजिटरी कैसे ईमेल कर सकता हूं? जावास्क्रिप्ट में खाली स्ट्रिंग के लिए आप कैसे जांचें? JavaScript का उपयोग करके किसी तत्व की सीएसएस संपत्ति पढ़ें स्थानीय रूप से घोषित चर का निरीक्षण नहीं किया जा सकता अजगर कोड का उपयोग करके एक .bat फ़ाइल चलाएं टर्मिनल से ईमेल कैसे भेजें? सी # में ट्री डेटा संरचना एक लूप के अंदर या बाहर चर को घोषित करना PHP: "नोटिस: अपरिभाषित चर", "नोटिस: अपरिभाषित सूचकांक", और "नोटिस: अपरिभाषित ऑफ़सेट" Std :: वादा क्या है? रीव्रेटबेज क्या करती है और इसका उपयोग कैसे किया जाता है? स्विफ्ट लागू करें। अपरकेस स्ट्रिंग केवल एक स्ट्रिंग का पहला अक्षर है IIS पूल का LoadUserProfile सेट करते समय वास्तव में क्या होता है?

पार्सिंग प्रदर्शन (यदि, ट्रायप्रॉर्स, टच-कैच)

मुझे जानकारी के लिए पाठ को पार्स करने के विभिन्न तरीकों के बारे में बहुत कुछ पता है उदाहरण के लिए पूर्णांक को पार्स करने के लिए, किस प्रकार का प्रदर्शन अपेक्षित किया जा सकता है मैं सोच रहा हूं कि इस पर किसी भी अच्छे आंकड़ों के बारे में कोई जानता है। मैं किसी ऐसे व्यक्ति से कुछ वास्तविक संख्या की तलाश कर रहा हूं जिसने इस का परीक्षण किया है।

इनमें से कौन सा परिस्थितियों में सर्वश्रेष्ठ प्रदर्शन प्रदान करता है?

Parse(...) // Crash if the case is extremely rare .0001% If (SomethingIsValid) // Check the value before parsing Parse(...) TryParse(...) // Using TryParse try { Parse(...) } catch { // Catch any thrown exceptions } 

वेब के समाधान से एकत्रित समाधान "पार्सिंग प्रदर्शन (यदि, ट्रायप्रॉर्स, टच-कैच)"

हमेशा T.TryParse (स्ट्रिंग स्ट्र, आउट टी मान) का उपयोग करें । अपवाद फेंकना महंगा है और यदि आप स्थिति को प्राथमिकता से संभाल सकते हैं तो उसे टालना चाहिए। प्रदर्शन पर "सेव" करने के लिए एक प्रयास-पकड़ ब्लॉक का उपयोग करना (क्योंकि आपकी अमान्य डाटा दर कम है) अनुरक्षण क्षमता और अच्छे कोडिंग प्रथाओं की कीमत पर अपवाद प्रबंधन का दुरुपयोग है। ध्वनि सॉफ्टवेयर इंजीनियरिंग विकास प्रथाओं का पालन करें, अपने परीक्षण के मामले लिखें, अपना आवेदन चलाने, फिर बेंचमार्क और अनुकूल करें

"हमें कम क्षमता के बारे में भूलना चाहिए, समय का लगभग 97% कहना है: समय से पहले अनुकूलन सभी बुराइयों की जड़ है । फिर भी हमें इस महत्वपूर्ण 3% में अपना अवसर नहीं देना चाहिए" – डोनाल्ड नुथ

इसलिए आप मनमाने ढंग से कार्बन क्रेडिट्स में असाइन करते हैं, कि कोशिश-पकड़ का प्रदर्शन खराब है और यह कोशिश करता है कि TryParse का प्रदर्शन बेहतर है । हमारे आवेदन को चलाने के बाद और यह निर्धारित किया है कि हमारे पास कुछ प्रकार की मंदी की कटाई स्ट्रिंग पार्सिंग है, तो हम TryParse के अलावा कुछ भी उपयोग करने पर विचार करेंगे।

(संपादित करें: क्योंकि यह प्रतीत होता है कि समय-समय पर सूचना देने के लिए प्रश्नकर्ता अच्छा सलाह लेता है, यहाँ अनुरोध किया गया समय डेटा है)

उपयोगकर्ताओं से 10,000 निविष्टियों पर विभिन्न असफलता दर के लिए समय (अविश्वासियों के लिए):

 Failure Rate Try-Catch TryParse Slowdown 0% 00:00:00.0131758 00:00:00.0120421 0.1 10% 00:00:00.1540251 00:00:00.0087699 16.6 20% 00:00:00.2833266 00:00:00.0105229 25.9 30% 00:00:00.4462866 00:00:00.0091487 47.8 40% 00:00:00.6951060 00:00:00.0108980 62.8 50% 00:00:00.7567745 00:00:00.0087065 85.9 60% 00:00:00.7090449 00:00:00.0083365 84.1 70% 00:00:00.8179365 00:00:00.0088809 91.1 80% 00:00:00.9468898 00:00:00.0088562 105.9 90% 00:00:01.0411393 00:00:00.0081040 127.5 100% 00:00:01.1488157 00:00:00.0078877 144.6 /// <param name="errorRate">Rate of errors in user input</param> /// <returns>Total time taken</returns> public static TimeSpan TimeTryCatch(double errorRate, int seed, int count) { Stopwatch stopwatch = new Stopwatch(); Random random = new Random(seed); string bad_prefix = @"X"; stopwatch.Start(); for(int ii = 0; ii < count; ++ii) { string input = random.Next().ToString(); if (random.NextDouble() < errorRate) { input = bad_prefix + input; } int value = 0; try { value = Int32.Parse(input); } catch(FormatException) { value = -1; // we would do something here with a logger perhaps } } stopwatch.Stop(); return stopwatch.Elapsed; } /// <param name="errorRate">Rate of errors in user input</param> /// <returns>Total time taken</returns> public static TimeSpan TimeTryParse(double errorRate, int seed, int count) { Stopwatch stopwatch = new Stopwatch(); Random random = new Random(seed); string bad_prefix = @"X"; stopwatch.Start(); for(int ii = 0; ii < count; ++ii) { string input = random.Next().ToString(); if (random.NextDouble() < errorRate) { input = bad_prefix + input; } int value = 0; if (!Int32.TryParse(input, out value)) { value = -1; // we would do something here with a logger perhaps } } stopwatch.Stop(); return stopwatch.Elapsed; } public static void TimeStringParse() { double errorRate = 0.1; // 10% of the time our users mess up int count = 10000; // 10000 entries by a user TimeSpan trycatch = TimeTryCatch(errorRate, 1, count); TimeSpan tryparse = TimeTryParse(errorRate, 1, count); Console.WriteLine("trycatch: {0}", trycatch); Console.WriteLine("tryparse: {0}", tryparse); } 

हालांकि मैंने व्यक्तिगत रूप से अलग-अलग तरीकों से प्रमाणित नहीं किया है, इस चरण में ये हैं:

http://blogs.msdn.com/ianhu/archive/2005/12/19/505702.aspx

कोशिश-पकड़ हमेशा धीमी हो जाएगी TryParse तेज़ हो जाएगा

IF और TryParse समान हैं

 Option 1: Will throw an exception on bad data. Option 2: SomethingIsValid() could be quite expensive - particularly if you are pre-checking a string for Integer parsability. Option 3: I like this. You need a null check afterwards, but it's pretty cheap. Option 4 is definitely the worst. 

अपवाद हैंडलिंग तुलनात्मक रूप से महंगा है, इसलिए यदि आप कर सकते हैं तो इसे से बचें।

विशेष रूप से, खराब आदानों की अपेक्षा की जानी है, असाधारण नहीं, इसलिए आपको उन्हें इस स्थिति के लिए उपयोग नहीं करना चाहिए।

(हालांकि, TryParse से पहले, यह सबसे अच्छा विकल्प हो सकता है।)