이 질문에 대한 답변이 this other one입니다.캡쳐하는 것보다 때때로 (때때로) 빨리보기가 더 빠른 이유는 무엇입니까?
s/,(\d)/$1/
과 s/,(?=\d)//
의 비교 : 전자는 캡처 그룹을 사용하여 쉼표가 아닌 숫자 만 바꾸고, 후자는 미리보기를 사용하여 쉼표가 숫자로 성공하는지 확인합니다. this answer에서 논의 된 것처럼 때로는 후자가 더 빨리 나타나는 이유는 무엇입니까?
이 질문에 대한 답변이 this other one입니다.캡쳐하는 것보다 때때로 (때때로) 빨리보기가 더 빠른 이유는 무엇입니까?
s/,(\d)/$1/
과 s/,(?=\d)//
의 비교 : 전자는 캡처 그룹을 사용하여 쉼표가 아닌 숫자 만 바꾸고, 후자는 미리보기를 사용하여 쉼표가 숫자로 성공하는지 확인합니다. this answer에서 논의 된 것처럼 때로는 후자가 더 빨리 나타나는 이유는 무엇입니까?
두 가지 방법은 서로 다른 작업을 수행하며 서로 다른 종류의 간접비가 있습니다. 캡처 할 때 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)"
나는 대부분의 경우에 캡처보다 빠른 것으로 미리 봐 기대를하지만, 다른 스레드에서 언급 한 바와 같이 정규 표현식의 성능은 데이터에 따라 달라질 수 있습니다.
나는're' pragma에 대해 생각해 봤어야했다. 감사! – mpe
은 언제나처럼, 당신은 작동 빠른 코드의 두 조각을 알고 싶을 때, 당신은 그것을 테스트해야 :
#!/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)//;
}
벤치 마크는 세 가지 경우 테스트 : 만
는, 이러한 결과를 얻게
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가 그의 주석에서 이미 설명했듯이 사실 놀랍지도 않습니다. 두 개의 정규 표현식에 대한 몇 가지 벤치 마크 테스트를 수행
안부, 마티아스
질문은 _which_가 빠르지 않고 _why_입니다. –
나는 이것을 테스트하는 방법을 안다. 그리고 사실, 나 자신을 그렇게했다. , 데모를 주셔서 감사합니다; 귀하의 결과는 매우 실례입니다! – mpe
난 정말 큰 차이를 확인할 수 없습니다. 둘 다 매우 빠릅니다. 이러한 regexes, 대충 캡쳐 대 사전에 적용되지 않습니다. – TLP
그것의 명백한 : 데이터를 복사하고 다음에 대체 할 그룹 강제력을 대체하려면'$ 1'의 보간이 필요하지만 두 번째 정규식은 단지 찾기/확인/제거입니다. 그러나 속도의 차이는 보이지 않아야합니다. – PSIAlt