내 ASP.net 프로젝트에서 사용자 입력을위한 몇 가지 기본 데이터 형식의 유효성을 검사해야합니다. 데이터 유형은 숫자, 십진수, 날짜 시간 등과 같습니다.Regex vs Tryparse 무엇이 가장 좋은 성능입니까?
성능면에서 가장 좋은 방법은 무엇입니까? Regex.IsMatch()
또는 TryParse()
으로 처리 할 예정입니까?
미리 감사드립니다. 말을 다른, 그 답을하는 가장 좋은 방법은 그것을 측정하는 것입니다으로
내 ASP.net 프로젝트에서 사용자 입력을위한 몇 가지 기본 데이터 형식의 유효성을 검사해야합니다. 데이터 유형은 숫자, 십진수, 날짜 시간 등과 같습니다.Regex vs Tryparse 무엇이 가장 좋은 성능입니까?
성능면에서 가장 좋은 방법은 무엇입니까? Regex.IsMatch()
또는 TryParse()
으로 처리 할 예정입니까?
미리 감사드립니다. 말을 다른, 그 답을하는 가장 좋은 방법은 그것을 측정하는 것입니다으로
)
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());
}
}
실제로 응답이 필요한 사람들을위한 dr :'int.TryParse()'는 항상'Regex.IsMatch()'보다 빠릅니다 (최대 크기까지) . 'RegexOptions.Compiled'로 구성된 Regex 객체보다 빠릅니다. 숫자의 길이에 따라 상황에 맞는 적절한 클래스 (예 :'ulong')를 사용하고'decimal.TryParse()'가'int.TryParse()'보다 상당히 느리다는 것을 명심하십시오. 이들 중 어느 것도 당신을 위해 작동하지 않는다면,'stringVariable.All (char.IsDigit)'는 성능 측면에서 허용되는 중간 수준을 제공합니다. 또한 멋지고 간결합니다. –
나는 "All (char.isdigit)"트릭을 지금하지 않았다! 나는 그것을 좋아한다!! – Bruno
나는 TryParse 빨리 추측 거라고하지만, 더 중요한 것은 더 표현입니다.
사용중인 각 데이터 유형에 대해 유효한 값을 모두 고려하면 정규 표현식이 꽤 추해 질 수 있습니다. 예를 들어 DateTime을 사용하면 월이 1에서 12 사이인지 확인하고 해당 월의 유효한 범위 내에 해당 날짜가 있어야합니다.
TryParse
및 Regex.IsMatch
은 근본적으로 다른 두 가지 용도로 사용됩니다. Regex.IsMatch
은 해당 문자열이 특정 패턴과 일치하는지 알려줍니다. 예/아니오 응답을 반환합니다. TryParse
은 가능한 경우 실제로 값을 변환하고 성공했는지 여부를 알려줍니다. 당신이 정규 표현식 공예에 매우 조심를 아니라면 TryParse
이 false
를 반환합니다 true
때
, Regex.IsMatch
는 반환 할 수 있습니다. 예를 들어, byte
을 파싱하는 간단한 경우를 생각해보십시오. TryParse
하면 있습니다 myString
의 값이 0에서 255 사이
byte b;
bool isGood = byte.TryParse(myString, out b);
경우, TryParse
이 true
를 반환합니다.
이제는 Regex.IsMatch
으로 시도해 보겠습니다. 보자, 정규 표현식은 무엇이되어야 하는가? @"\d+"
또는 @\d{1,3}"
이라고 말할 수는 없습니다. 형식을 지정하는 것은 매우 어려운 작업이됩니다. 공백 문자의 앞과 뒤의 0을 처리해야하며 255
은 허용하지만 256
은 허용하지 마십시오.
3 자리 숫자를 구문 분석하기위한 것입니다. int
또는 long
을 구문 분석 할 때 규칙이 더욱 복잡해집니다.
정규 표현식은 형태를 결정하는 중대하다. 그들은 값을 결정할 때를 망칩니다. 표준 데이터 유형에는 모두 한계가 있기 때문에 그 값을 결정하는 것은 유효한지 여부를 파악하는 데 있습니다.
가능한 경우 TryParse
을 사용하는 것이 더 나을 것입니다. 유효성 검사를 수행 할 신뢰할 수있는 정규 표현식을 찾으려는 두통을 피하려면. 그것은 기본 유형의에 대한 특정 TryParse
는 해당 정규식보다 빠르게 실행됩니다 (나는 거의 확실 말할 것) 가능성이 높습니다.
위 답변에서 귀하의 웹 페이지가 귀하의 TryParse
또는 Regex.IsMatch
을 실행하는 데 소비하는 것보다 많은 시간을 보냈을 것입니다.이러한 작업을 수행하는 시간은 웹 사이트가 수행하는 모든 작업의 컨텍스트에서 너무 작기 때문에 문제를 숙고 할 때마다 낭비됩니다.
가능한 경우 TryParse
을 사용하십시오. 쉽습니다. 그렇지 않으면 Regex
을 사용하십시오.
regexes가 모든 작업을 수행하지 마십시오.
간혹 정규식을 사용하면 90 %의 길을 얻고 필요한 모든 것을 할 수 있습니다. 복잡성이 10 배 이상 커집니다.
그러면 가장 간단한 해결책은 정규식을 사용하여 양식을 확인한 다음 값 확인을 위해 오래된 코드를 사용하는 것입니다.
예를 들어, 정규식을 사용하여 날짜 형식의 일치 항목을 확인한 다음 캡처 그룹을 사용하여 개별 값의 값을 확인하십시오.
정말 신경 씁니까? 다른 모든 것들과 비교해 보면 asp.net은 두 가지 접근법 중 어느 것도 성능에 미치는 영향이 미미한 것처럼 보입니다. – mmix
(Ajax Control Toolik) [http://ajaxcontrolooloolkit.codeplex.com/]을 사용하여 행복해집니다. –
가장 적절하고 유지하기 쉬운 것을 사용하십시오. 성능은이 경우에는 별다른 문제가 아님 :) –