2012-07-18 4 views
0

나는 아래와 같은 코드를 가지고 있는데 정규식 비교를하고있다. 코드를 최적화하기 위해 생각했다. .net 프로파일 러를 사용하면 여기서 80 %의 시간을 소비하고, 정규식 필터를 점검했다. 이 side.So이 정규 표현식에, 내가 링크 http://blog.kurtschindler.net/post/regular-expression-performance-comparisons을보고 인터넷 검색 할 때 기존 코드 정규식 성능 문제가 있습니까?

public class TestFilter : SmoothFilter 
    { 
    public override bool Apply(Team liveEvent) 
      { 
        // Apply each individual piece of the filter using the Match method 
        if ((Filter == null) || (Filter.Length <= 0) || Match(Filter, pl.Instance)) 
        { 

      } 

    private bool Match(string pattern, string inputdata) 
    { 
     bool vals = Regex.IsMatch(inputdata, pattern, RegexOptions.IgnoreCase); 
     return vals; 
    } 
} 

당신이 초기 시작까지 시간을내어하지 않을 경우 가장 빠른 방법을 언급하고있다. 그래서 아래와 같이 코드를 수정했습니다. 하지만 필자는 필자의 시스템을 옮겨서 프로필을 작성하는 도구가 없다.

다음이 수정 된 코드
static readonly Regex regexForMethod_E = new Regex("pattern", RegexOptions.Compiled); 

private bool Match(string pattern, string inputdata) 
{ 
    bool vals = regexForMethod_E.IsMatch("inputdata"); 
    return vals; 
} 

편집 난 아직 내가 일치 안에 정규식 인스턴스를 이동하는 방법을 잘 모릅니다

() 메소드

+0

당신은 당신의 자신의 간단한 속도 테스트를 쓸 수 있습니다 - 예를 들면 : http://guyellisrocks.com/coding/speed-improvements-with-compiled-regex/ 성능을 비교하기 – dash

+1

문제는 Regex 패턴에 따라 달라질 수 있습니다. 패턴에 대한 자세한 정보를 추가하십시오. – Ria

+2

그럴 경우 왜 평등에 대한 간단한 비교를 수행하는 경우 정규 표현식을 사용합니까? –

답변

0

짧은 답변 : 나는 네, 그렇게 생각하지만, 내가 돈 ' 얼마나 많이 알지.

답변 : 나는 당신 자신과 계산 시간을 많이 절약 할 수 있다고 생각합니다. 첫 번째 인스턴스에서 수행해야 할 계산 방법을 살펴보십시오. 이제는 두 번째 메소드에서 수행해야하는 작업을 살펴보십시오. 함수는 3 개가 아닌 하나의 매개 변수 만 전달하면됩니다. 그것은 성능 이득입니다 (비록 작음).

정규식은 이미 계산되었으므로 프로그램에서 수행해야하는 모든 작업은 모든 매개 변수를 가져 와서 직접 계산하는 것이 아니라 입력 데이터와 비교하여 검사해야합니다.

private bool Match(string inputdata) 
{ 
    return regexForMethod_E.IsMatch("inputdata"); 
} 

내가 변화는 거의 무시할 것을 알고 있지만,이 호출이 1000 배를 만들어지고 상상 :

이보다 더 빠른 방법이 될 것입니다. 그것은 실제로 필요하지 않은 1000 개의 부울 변수입니다!

+0

입니다. 실제로 메서드에 1 개의 매개 변수 만 있으면 3보다 성능이 좋을 것이라고 말하는 것입니까? 반환 값에 대한 변수를 만들면 성능이 향상됩니까? – Jamiec

+0

@nathanwhite okey하지만 함수의 매개 변수에 대해 언급 한 내용을 이해할 수 없습니다. 새 코드가 잘못되었거나 효율적이지 않은 경우 수정하고 게시 할 예정입니까? – vettori

+0

@Jamiec "나는 생각한다", "나는 믿는다"고 말하고 싶습니다. 나는 그렇게 생각할 것이다. 그러나 제발, 만일 당신이 나를 틀리게 증명할 수 있으면, 나는 배울 것을 좋아한다. :) –

1

패턴의 복잡성에 따라 다릅니다. 어떤 경우에는 느려지지 않을 것이고, 정규 표현식의 더 복잡한 경우 더 많은 속도를 낼 것입니다.

또한 코드는 동일하지 않습니다. 이렇게하려면, 당신은 전화를해야합니다

new Regex("pattern", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
+0

나는 그다지 알지 못합니다. 당신은 당신의 의견으로 내 옛 코드를 수정할 수 있습니다. 내 질문이 modifief 있습니다. – vettori

+0

저는 Match() 메서드 내에서 regex 인스턴스를 움직이는 법을 아직도 모릅니다. – vettori

+0

그냥 한 번 인스턴스화하려면 클래스 멤버로 유지하십시오. 동일한 패턴을 여러 번 사용하면 가장 좋은 방법입니다. –

관련 문제