2012-08-25 19 views
9

मुझे आश्चर्य हुआ कि DateTime.Parse कितना धीमा है। इस कोड को चलाने के लिए लगभग 100 सेकंड लगते हैं; अगर मैं रेगेक्स संस्करण का उपयोग करता हूं तो इसमें 100 मिलीसेकंड लगते हैं। यहां क्या हो रहा है?डेटटाइम क्यों है। पर्स इतनी धीमी है?

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
var re = new Regex(@"(\d\d)/(\d\d)/(\d\d\d\d) (\d\d):(\d\d):(\d\d)", RegexOptions.Compiled); 
for (int i = 0; i < 100000; i++) 
{ 
    //var m = re.Match("08/01/2012 23:10:12"); 
    DateTime.Parse("08/01/2012 23:10:12", CultureInfo.CreateSpecificCulture("en-US")); 
} 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 

संपादित: मार्क सही है, चलती पाश बाहर CultureInfo.CreateSpecificCulture("en-US") में मदद की। कारण मैं इसे पहले नहीं किया है कि मैं वी.एस. प्रोफाइलर के साथ इस कोड प्रोफाइल और यह परिणाम के बाद पता चला है:

enter image description here

उत्तर

23

यह एक निष्पक्ष परीक्षण नहीं है।

  1. CultureInfo.CreateSpecificCulture("en-US") पर कॉल धीमा हिस्सा है। इसे लूप के बाहर ले जाएं, परिणाम संग्रहित करें और इसका पुन: उपयोग करें।

  2. आपकी नियमित अभिव्यक्ति केवल एक विशिष्ट प्रारूप को संभालती है, लेकिन DateTime.Parse कई अलग-अलग इनपुट स्वरूपों को संभाल सकता है। यह तय करना है कि कौन से प्रारूप को समझते हैं, इसका उपयोग करने के लिए सही है। यदि आप पहले से जानते हैं कि प्रारूप DateTime.Parse के बजाय DateTime.ParseExact का उपयोग करता है।

निश्चित कोड इस प्रकार है:

CultureInfo ci = CultureInfo.CreateSpecificCulture("en-US"); 
for (int i = 0; i < 100000; i++) 
{ 
    DateTime.ParseExact("08/01/2012 23:10:12", "MM/dd/yyyy HH:mm:ss", ci); 
} 
इन दो परिवर्तन के साथ

, मैं DateTime.ParseExact और नियमित अभिव्यक्ति दृष्टिकोण लगभग एक ही हैं।

और आपकी नियमित अभिव्यक्ति कुछ डेटाटाइम स्वीकार करती है जो अमान्य हैं, जैसे कि 00/00/0000 99:99:99। यदि आप इसे ठीक करते हैं तो यह केवल वैध डेटाटाइम स्वीकार करता है, यह धीमा होगा।

+1

ओह, मैं बहुत बेवकूफ महसूस करता हूं, वास्तव में लूप निश्चित प्रदर्शन से 'CreateSpecificCulture' को स्थानांतरित करता हूं। कारण मैंने पहले ऐसा नहीं किया क्योंकि मैंने वीएस प्रोफाइलर का उपयोग किया और यह दिखाया कि समस्या 'पारसे' में है, संपादन में स्क्रीनशॉट देखें। – Andrey

+0

मैं निश्चित रूप से सहमत हूं कि रेगेक्स का उपयोग करना यहां धोखाधड़ी का प्रकार है, लेकिन मैंने इसे स्विच करने पर विचार किया क्योंकि मुझे 100% यकीन था कि इनपुट डेटा मान्य है और प्रदर्शन अधिक महत्वपूर्ण था। – Andrey

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