2012-06-12 7 views
2
(모두 20) 여러 정규식 명령을 사용하여 메시지를 구문 분석 할 때 성능 문제에 봉착

:성능 문제는

는 효율성 고체를하기 위해 나는이 :

1)가 주문한 가능성에 의한 정규식 명령.

2) 일치하는 루프가 발견되면 일치하는 루프가 빠져 나올 수 있습니다.

내가 할 수있는 다른 개선 사항이 있는지 또는 내 문제에 대한 더 나은 접근 방법이 있는지 궁금합니다.

호출 코드 : 정규식 명령의

 bool resolved = false; 
     Match regexMatch = null; 

     foreach (var resolverKvp in _resolvers) 
     { 
      if (resolverKvp.Key.Pattern.IsMatch(topicName)) 
      { 
       regexMatch = resolverKvp.Key.Pattern.Match(topicName); 
       // Use the kvp value 
       resolved = true; 
       break; 
      } 
     } 

샘플을 통해 반복 :

<add messagename="BackLayVolumeCurrencyOddsFormat" pattern="^.*/M/E_([0-9]+)/MEI/MDP/(\d{1,3})_(\d{1,3})_(\d+)_([a-zA-Z]{3})_([1-3])$" assembly="Client.Messaging" 
     type="Client.Messaging.TopicMessages.BackLayVolumeCurrencyOddsFormatResolver"> 
    </add> 

    <add messagename="Market1" pattern="^.*/M/E_([0-9]+)$" assembly="Client.Messaging" 
     type="Client.Messaging.TopicMessages.Market1Resolver"> 
    </add> 

데이터 예 :

regex 1: 
6/E/E_1/E/E_511010/E/E_527901/E/E_631809/E/E_631810/E/E_631811/M/E_1379656/MEI/MDP/10_10_1_USD_3 

regex 2: 
1/E/E_1/E/E_100004/E/E_190539/E/E_632113/E/E_632120/M/E_1380084 

은 사전에 감사합니다.

+1

RegexOptions.Compiled를 시도 했습니까? –

+0

RegexOptions.Compiled 추가하기. 감사. – Totero

+0

위대한 질문 ..이게 나 자신과 같은 일을하고 있었다 .. Crazeee world –

답변

3

첫 번째 (작음) 눈에 띄는 것은 발견 된 정규식이 두 번 실행된다는 것입니다. 한 번 일치하는 항목을 확인한 다음 일치 항목을 찾습니다. 얼마나 많은 성능 차이를 확인하지 ismatch은 제공하지만, 당신은 체크를 결합하고 찾을 수 : 시도

regexMatch = resolverKvp.Key.Pattern.Match(topicName); 
if (regexMatch.Success) 
{ 
     //etc 
+0

물론! 훌륭합니다. 성능 측정 항목을 지금 실행 중입니다. – Totero

+0

아주 단순합니다 .. 멋지다! –

1

한 것은 당신의 표현에 .*을 방지하는 것입니다. 귀하의 예제에서는 이 필요하지 않은 것으로 보이며, 특히 표현식에 이 일치하지 않으면 무료가 아닙니다. 매우 빠르고 지저분한 시험은 패턴 1과 사이에서 2 분의 1을 보여 주며, 해당 부분은 ^.* 부분이 아닙니다.

또한 표현식에 .*을 두 번 이상 사용하면 catastrophic backtracking이 될 수 있습니다.

+0

그레이트 스팟. 감사. – Totero