2012-08-25 185 views
9

我在DateTime.Parse如何慢是震驚。 此代碼需要大約100秒才能運行;如果我使用正則表達式版本,它需要100毫秒。 這是怎麼回事?爲什麼DateTime.Parse這麼慢?

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")幫助。之前我沒有這樣做的原因是,我評測的這款代碼VS探查,它顯示以下結果:

enter image description here

回答

23

這不是一個公平的測試。

  1. 呼叫CultureInfo.CreateSpecificCulture("en-US")是緩慢的部分。將其移到循環外部,存儲結果並重用。

  2. 你的正則表達式只處理一個特定的格式,但DateTime.Parse可以處理多種不同的輸入格式。它必須決定它理解的許多格式中哪一個是正確的格式。如果你事先知道是什麼格式,然後用DateTime.ParseExact代替DateTime.Parse

固定的代碼如下:

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'圈外固定性能。之前我沒有這樣做的原因是因爲我使用的VS探查,它表明,問題是在'Parse',請參閱編輯截圖。 – Andrey

+0

我當然同意使用正則表達式在這裏有點作弊,但我考慮切換到它,因爲我100%確定輸入數據是有效的,性能更重要。 – Andrey