2011-04-19 13 views
7

ASP.net projemde, kullanıcı girişleri için bazı temel veri türlerini doğrulamamız gerekiyor. veri türleri datetime vb sayısal, ondalık,Regex vs Tryparse performansta en iyisi ne

Ben performans açısından almış en iyi yaklaşım nedir gibidir? Regex.IsMatch() veya TryParse() tarafından mı?

Şimdiden teşekkürler. derdi başka, buna cevap vermek iyi yolu, onu ölçmektir gibi

+8

Gerçekten önemsiyor musunuz? Asp.net'in diğer her şeyle karşılaştırıldığında, performansın etkisi açısından iki yaklaşımdan herhangi biri önemsiz görünmektedir. – mmix

+0

(Ajax Control Toolik) [http://ajaxcontroltoolkit.codeplex.com/] kullanın ve mutlu olun. –

+0

Bakıma en uygun/en kolay olanı kullanın. Performans bu durumda bir sorun değil :) –

cevap

4

;)

static void Main(string[] args) 
    { 

     List<double> meansFailedTryParse = new List<double>(); 
     List<double> meansFailedRegEx = new List<double>(); 
     List<double> meansSuccessTryParse = new List<double>(); 
     List<double> meansSuccessRegEx = new List<double>(); 


     for (int i = 0; i < 1000; i++) 
     { 


      string input = "123abc"; 

      int res; 
      bool res2; 
      var sw = Stopwatch.StartNew(); 
      res2 = Int32.TryParse(input, out res); 
      sw.Stop(); 
      meansFailedTryParse.Add(sw.Elapsed.TotalMilliseconds); 
      //Console.WriteLine("Result of " + res2 + " try parse :" + sw.Elapsed.TotalMilliseconds); 

      sw = Stopwatch.StartNew(); 
      res2 = Regex.IsMatch(input, @"^[0-9]*$"); 
      sw.Stop(); 
      meansFailedRegEx.Add(sw.Elapsed.TotalMilliseconds); 
      //Console.WriteLine("Result of " + res2 + " Regex.IsMatch :" + sw.Elapsed.TotalMilliseconds); 

      input = "123"; 
      sw = Stopwatch.StartNew(); 
      res2 = Int32.TryParse(input, out res); 
      sw.Stop(); 
      meansSuccessTryParse.Add(sw.Elapsed.TotalMilliseconds); 
      //Console.WriteLine("Result of " + res2 + " try parse :" + sw.Elapsed.TotalMilliseconds); 


      sw = Stopwatch.StartNew(); 
      res2 = Regex.IsMatch(input, @"^[0-9]*$"); 
      sw.Stop(); 
      meansSuccessRegEx.Add(sw.Elapsed.TotalMilliseconds); 
      //Console.WriteLine("Result of " + res2 + " Regex.IsMatch :" + sw.Elapsed.TotalMilliseconds); 
     } 

     Console.WriteLine("Failed TryParse mean execution time  " + meansFailedTryParse.Average()); 
     Console.WriteLine("Failed Regex mean execution time  " + meansFailedRegEx.Average()); 

     Console.WriteLine("successful TryParse mean execution time " + meansSuccessTryParse.Average()); 
     Console.WriteLine("successful Regex mean execution time " + meansSuccessRegEx.Average()); 
    } 
} 
+4

tl; aslında bir cevap ihtiyacı olanlar için dr: 'int.TryParse()' her zaman daha hızlıdır 'Regex.IsMatch() '(büyüklük sırasına kadar) . Ayrıca RegexOptions.Compiled' ile oluşturulan bir Regex nesnesinden daha hızlıdır. Durumunuzun uzunluğuna bağlı olarak durumunuza uygun sınıfı (örn. 'Ulong') kullandığınızdan emin olun ve decimal.TryParse()' ın int.TryParse() 'dan çok daha yavaş olduğunu unutmayın. Bunlardan hiçbiri sizin için işe yaramadıysa, 'stringVariable.All (char.IsDigit)', performans açısından kabul edilebilir bir orta zemin sağlar ve aynı zamanda güzel ve özlüdür. –

+0

Şimdi "Tüm (char.isdigit)" hilesi yapmadım! Onu seviyorum !! – Bruno

1

Ben TryParse hızlıdır tahmin ediyorum, ama daha önemlisi, daha etkileyici bu. Her veri kullandığınız tip için tüm geçerli değerler göz önüne aldığımızda

düzenli ifadeler gayet çirkin olabiliyor. Örneğin, DateTime ile ayın 1 ile 12 arasında olmasını ve günün o belirli ay için geçerli aralıkta olmasını sağlamalısınız. İki temelde farklı şeyler için

9

TryParse ve Regex.IsMatch kullanılır. Regex.IsMatch, söz konusu dizenin belirli bir desenle eşleşip eşleşmediğini size söyler. Evet/hayır cevabı verir. TryParse aslında mümkün olduğunda değeri dönüştürür ve başarılı olup olmadığını söyler. Eğer düzenli ifadeyi işçiliği çok dikkatli olmadıkça TryParsefalse dönecektir true zaman

, Regex.IsMatch dönebilirsiniz. Örneğin, byte'u ayrıştırma işleminin basit durumunu düşünün. TryParse ile vardır: myString değeri 0 ile 255 arasında olduğunu

byte b; 
bool isGood = byte.TryParse(myString, out b); 

ise TryParsetrue dönecektir.

Şimdi, Regex.IsMatch ile deneyelim. Bakalım, bu normal ifade ne olmalı? @"\d+" veya hatta @\d{1,3}" bile diyemeyiz. Biçimi belirtmek çok zor bir iş haline gelir. Önde gelen ve devam eden beyaz alanı takip eden 0'ları işlemek zorundasınız ve 255'a izin vermeli, ancak 256'a izin vermemelisiniz.

Ve bu sadece 3 basamaklı bir sayı ayrıştırmak içindir. Kurallar, bir int veya long'u ayrıştırırken daha da karmaşıklaşır.

Düzenli ifadeler, formunun formunu belirlemek için idealdir. değerini belirlerken emerler. Standart veri türlerimizin tümü sınırlara sahip olduğundan, değerinin belirlenmesi, sayının geçerli olup olmadığının belirlenmesinin bir parçasıdır.

TryParse'u kullanarak mümkün olan her durumda, yalnızca doğrulama işlemini gerçekleştirecek güvenilir bir düzenli ifade oluşturmaya çalışırken kendinizi baş ağrısından kurtarmanız daha iyi olur. Yerel türlerden herhangi biri için belirli bir TryParse'un eşdeğer düzenli ifadeden daha hızlı yürütülmesi olasıdır.

Yukarıda da belirtildiği gibi, muhtemelen bu yanıt üzerinde daha fazla zaman harcadım. Web sayfanız, tüm yaşam boyunca TryParse veya Regex.IsMatch - işlemlerinizi yürütmek için harcayacaktır.Bu şeyleri yürütme zamanı, Web sitenizin gerçekleştirdiği diğer her şey bağlamında o kadar küçüktür ki, herhangi bir zaman harcadığınız zaman, problemin boşa harcanmasına neden olur.

TryParse'u kullanabilirsiniz, çünkü daha kolay. Aksi halde Regex kullanın.

4

Düzenli ifadeler her şeyi yapmaya çalışmayın.

Bazen basit bir regex, yolun% 90'ını alır ve karmaşıklığa ihtiyaç duyduğunuz her şeyi on ya da daha fazla kez büyütür.

Sonra, genellikle en basit çözüm form denetlemek için düzenli ifadeyi kullanmak ve sonra değer denetimi için eski eski kod dayanmak olduğunu buluyorum. Örneğin bir tarih alın, bir tarih formatındaki bir eşleşmeyi kontrol etmek için bir regex kullanın ve ardından tek tek değerlerin değerlerini kontrol etmek için yakalama gruplarını kullanın.

İlgili konular