2012-12-03 3 views
7

이 질문에 대한 답변이 this other one입니다.캡쳐하는 것보다 때때로 (때때로) 빨리보기가 더 빠른 이유는 무엇입니까?

s/,(\d)/$1/s/,(?=\d)//의 비교 : 전자는 캡처 그룹을 사용하여 쉼표가 아닌 숫자 만 바꾸고, 후자는 미리보기를 사용하여 쉼표가 숫자로 성공하는지 확인합니다. this answer에서 논의 된 것처럼 때로는 후자가 더 빨리 나타나는 이유는 무엇입니까?

+1

난 정말 큰 차이를 확인할 수 없습니다. 둘 다 매우 빠릅니다. 이러한 regexes, 대충 캡쳐 대 사전에 적용되지 않습니다. – TLP

+4

그것의 명백한 : 데이터를 복사하고 다음에 대체 할 그룹 강제력을 대체하려면'$ 1'의 보간이 필요하지만 두 번째 정규식은 단지 찾기/확인/제거입니다. 그러나 속도의 차이는 보이지 않아야합니다. – PSIAlt

답변

4

두 가지 방법은 서로 다른 작업을 수행하며 서로 다른 종류의 간접비가 있습니다. 캡처 할 때 perl은 캡처 한 텍스트의 복사본을 만들어야합니다. 룩 어 헤드는 소비하지 않고 일치합니다. 그것은 시작 지점을 표시해야합니다. 당신은 re 'debug' pragma를 사용하여 무슨 일이 일어나고 있는지 볼 수 있습니다

use re 'debug'; 
my $capture = qr/,(\d)/; 
 
Compiling REx ",(\d)" 
Final program: 
    1: EXACT (3) 
    3: OPEN1 (5) 
    5: DIGIT (6) 
    6: CLOSE1 (8) 
    8: END (0) 
anchored "," at 0 (checking anchored) minlen 2 
Freeing REx: ",(\d)" 
use re 'debug'; 
my $lookahead = qr/,(?=\d)/; 
 
Compiling REx ",(?=\d)" 
Final program: 
    1: EXACT (3) 
    3: IFMATCH[0] (8) 
    5: DIGIT (6) 
    6: SUCCEED (0) 
    7: TAIL (8) 
    8: END (0) 
anchored "," at 0 (checking anchored) minlen 1 
Freeing REx: ",(?=\d)" 

나는 대부분의 경우에 캡처보다 빠른 것으로 미리 봐 기대를하지만, 다른 스레드에서 언급 한 바와 같이 정규 표현식의 성능은 데이터에 따라 달라질 수 있습니다.

+0

나는're' pragma에 대해 생각해 봤어야했다. 감사! – mpe

-1

은 언제나처럼, 당신은 작동 빠른 코드의 두 조각을 알고 싶을 때, 당신은 그것을 테스트해야 :

#!/usr/bin/perl 

use 5.012; 
use warnings; 
use Benchmark qw<cmpthese>; 

say "Extreme ,,,:"; 
my $Text = ',' x (my $LEN = 512); 
cmpthese my $TIME = -10, my $CMP = { 
    capture => \&capture, 
    lookahead => \&lookahead, 
}; 

say "\nExtreme ,0,0,0:"; 
$Text = ',0' x $LEN; 
cmpthese $TIME, $CMP; 

my $P = 0.01; 
say "\nMixed (@{[$P * 100]}% zeros):"; 
my $zeros = $LEN * $P; 
$Text = ',' x ($LEN - $zeros) . ',0' x $zeros; 
cmpthese $TIME, $CMP; 

sub capture { 
    local $_ = $Text; 
    s/,(\d)/$1/; 
} 

sub lookahead { 
    local $_ = $Text; 
    s/,(?=\d)//; 
} 

벤치 마크는 세 가지 경우 테스트 : 만

  1. 를 ' '
  2. '0 '
  3. 1 %'0 '휴식', '
내 컴퓨터에 내 펄 버전과3210

는, 이러한 결과를 얻게

Extreme ,,,: 
      Rate capture lookahead 
capture 23157/s  --  -1% 
lookahead 23362/s  1%  -- 

Extreme ,0,0,0: 
       Rate capture lookahead 
capture 419476/s  --  -65% 
lookahead 1200465/s  186%  -- 

Mixed (1% zeros): 
      Rate capture lookahead 
capture 22013/s  --  -4% 
lookahead 22919/s  4%  -- 

이러한 결과는 예견 버전은 거의에만 쉼표의 경우를 제외하고, 캡처보다 훨씬 빠르다는 것을 가정을 입증 할. 그리고 PSIAlt가 그의 주석에서 이미 설명했듯이 사실 놀랍지도 않습니다. 두 개의 정규 표현식에 대한 몇 가지 벤치 마크 테스트를 수행

안부, 마티아스

+1

질문은 _which_가 빠르지 않고 _why_입니다. –

+0

나는 이것을 테스트하는 방법을 안다. 그리고 사실, 나 자신을 그렇게했다. , 데모를 주셔서 감사합니다; 귀하의 결과는 매우 실례입니다! – mpe

관련 문제