2012-08-25 40 views
9

DateTime.Parse'un yavaş olmasından dolayı şok olmuştum. Bu kodun çalışması yaklaşık 100 saniye sürüyor; regex sürümünü kullanırsam 100 milisaniye sürer. Burada neler oluyor?DateTime.Parse neden bu kadar yavaş?

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); 

Düzenleme: Mark döngü dışında CultureInfo.CreateSpecificCulture("en-US") yardımcı hareketli, haklı. Daha önce yapmadım nedeni VS Profiler ile bu kodu profilli ve sonuç sonrasında gösterdi ki:

enter image description here

cevap

23

Bu adil bir test değil. CultureInfo.CreateSpecificCulture("en-US") için

  1. çağrı yavaş parçasıdır. Döngüsün dışına taşı, sonucu sakla ve tekrar kullan.

  2. Düzenli ifadeniz yalnızca belirli bir biçimi işler, ancak DateTime.Parse birçok farklı giriş formatını işleyebilir. Anlayacağı birçok formattan hangisinin doğru olduğuna karar vermek zorundadır. Formatın ne olduğunu önceden biliyorsanız, DateTime.Parse yerine DateTime.ParseExact kullanın. aşağıdaki gibi

sabit kod şudur: Bu iki değişikliklerle

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); 
} 

, ben DateTime.ParseExact ve düzenli ifade yaklaşımı neredeyse aynı olduğunu olsun.

Ve normal ifadeniz, 00/00/0000 99:99:99 gibi geçersiz olan bazı zamanları kabul eder. Düzeltirseniz, sadece geçerli verileri kabul eder, daha yavaş olur.

+1

Oooh, Kendimi çok aptalca hissediyorum, aslında CreateSpecificCulture'ı döngü dışı performanstan çıkartıyorum. Daha önce yapmadım çünkü VS Profiler kullandım ve problemin Parse'de olduğunu gösterdi, editte ekran görüntüsüne bakın. – Andrey

+0

Elbette Regex'i kullanmanın hile yaptığına katılıyorum, ancak giriş verisinin geçerli olduğundan ve performansın daha önemli olduğundan% 100 emin olduğum için buna geçiş yapmayı düşündüm. – Andrey

İlgili konular