2011-04-19 7 views
7

내 ASP.net 프로젝트에서 사용자 입력을위한 몇 가지 기본 데이터 형식의 유효성을 검사해야합니다. 데이터 유형은 숫자, 십진수, 날짜 시간 등과 같습니다.Regex vs Tryparse 무엇이 가장 좋은 성능입니까?

성능면에서 가장 좋은 방법은 무엇입니까? Regex.IsMatch() 또는 TryParse()으로 처리 할 예정입니까?

미리 감사드립니다. 말을 다른, 그 답을하는 가장 좋은 방법은 그것을 측정하는 것입니다으로

+8

정말 신경 씁니까? 다른 모든 것들과 비교해 보면 asp.net은 두 가지 접근법 중 어느 것도 성능에 미치는 영향이 미미한 것처럼 보입니다. – mmix

+0

(Ajax Control Toolik) [http://ajaxcontrolooloolkit.codeplex.com/]을 사용하여 행복해집니다. –

+0

가장 적절하고 유지하기 쉬운 것을 사용하십시오. 성능은이 경우에는 별다른 문제가 아님 :) –

답변

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

실제로 응답이 필요한 사람들을위한 dr :'int.TryParse()'는 항상'Regex.IsMatch()'보다 빠릅니다 (최대 크기까지) . 'RegexOptions.Compiled'로 구성된 Regex 객체보다 빠릅니다. 숫자의 길이에 따라 상황에 맞는 적절한 클래스 (예 :'ulong')를 사용하고'decimal.TryParse()'가'int.TryParse()'보다 상당히 느리다는 것을 명심하십시오. 이들 중 어느 것도 당신을 위해 작동하지 않는다면,'stringVariable.All (char.IsDigit)'는 성능 측면에서 허용되는 중간 수준을 제공합니다. 또한 멋지고 간결합니다. –

+0

나는 "All (char.isdigit)"트릭을 지금하지 않았다! 나는 그것을 좋아한다!! – Bruno

1

나는 TryParse 빨리 추측 거라고하지만, 더 중요한 것은 더 표현입니다.

사용중인 각 데이터 유형에 대해 유효한 값을 모두 고려하면 정규 표현식이 꽤 추해 질 수 있습니다. 예를 들어 DateTime을 사용하면 월이 1에서 12 사이인지 확인하고 해당 월의 유효한 범위 내에 해당 날짜가 있어야합니다.

9

TryParseRegex.IsMatch은 근본적으로 다른 두 가지 용도로 사용됩니다. Regex.IsMatch은 해당 문자열이 특정 패턴과 일치하는지 알려줍니다. 예/아니오 응답을 반환합니다. TryParse은 가능한 경우 실제로 값을 변환하고 성공했는지 여부를 알려줍니다. 당신이 정규 표현식 공예에 매우 조심를 아니라면 TryParsefalse를 반환합니다 true

, Regex.IsMatch는 반환 할 수 있습니다. 예를 들어, byte을 파싱하는 간단한 경우를 생각해보십시오. TryParse하면 있습니다 myString의 값이 0에서 255 사이

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

경우, TryParsetrue를 반환합니다.

이제는 Regex.IsMatch으로 시도해 보겠습니다. 보자, 정규 표현식은 무엇이되어야 하는가? @"\d+" 또는 @\d{1,3}"이라고 말할 수는 없습니다. 형식을 지정하는 것은 매우 어려운 작업이됩니다. 공백 문자의 앞과 뒤의 0을 처리해야하며 255은 허용하지만 256은 허용하지 마십시오.

3 자리 숫자를 구문 분석하기위한 것입니다. int 또는 long을 구문 분석 할 때 규칙이 더욱 복잡해집니다.

정규 표현식은 형태를 결정하는 중대하다. 그들은 을 결정할 때를 망칩니다. 표준 데이터 유형에는 모두 한계가 있기 때문에 그 값을 결정하는 것은 유효한지 여부를 파악하는 데 있습니다.

가능한 경우 TryParse을 사용하는 것이 더 나을 것입니다. 유효성 검사를 수행 할 신뢰할 수있는 정규 표현식을 찾으려는 두통을 피하려면. 그것은 기본 유형의에 대한 특정 TryParse는 해당 정규식보다 빠르게 실행됩니다 (나는 거의 확실 말할 것) 가능성이 높습니다.

위 답변에서 귀하의 웹 페이지가 귀하의 TryParse 또는 Regex.IsMatch을 실행하는 데 소비하는 것보다 많은 시간을 보냈을 것입니다.이러한 작업을 수행하는 시간은 웹 사이트가 수행하는 모든 작업의 ​​컨텍스트에서 너무 작기 때문에 문제를 숙고 할 때마다 낭비됩니다.

가능한 경우 TryParse을 사용하십시오. 쉽습니다. 그렇지 않으면 Regex을 사용하십시오.

4

regexes가 모든 작업을 수행하지 마십시오.

간혹 정규식을 사용하면 90 %의 길을 얻고 필요한 모든 것을 할 수 있습니다. 복잡성이 10 배 이상 커집니다.

그러면 가장 간단한 해결책은 정규식을 사용하여 양식을 확인한 다음 값 확인을 위해 오래된 코드를 사용하는 것입니다.

예를 들어, 정규식을 사용하여 날짜 형식의 일치 항목을 확인한 다음 캡처 그룹을 사용하여 개별 값의 값을 확인하십시오.

관련 문제