Như mọi khi, khi bạn muốn biết về hai đoạn mã hoạt động nhanh hơn, bạn phải kiểm tra nó:
#!/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)//;
}
Các benchmark kiểm tra ba trường hợp khác nhau:
- Chỉ', '
- Chỉ', 0'
- 1% '0' , phần còn lại','
Trên máy tính của tôi và với phiên bản perl của tôi, nó tạo ra những kết quả này:
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% --
Những kết quả substantiates giả định rằng phiên bản nhìn về phía trước là nhanh hơn đáng kể so với chụp, trừ trường hợp của hầu hết chỉ bằng dấu phẩy. Và nó thực sự không phải là rất đáng ngạc nhiên như PSIAlt đã giải thích trong bình luận của mình.
regards, Matthias
Làm một số xét nghiệm chuẩn trên hai regexes tôi có thể không thực sự xác định bất kỳ sự khác biệt tuyệt vời. Cả hai đều rất nhanh. Lưu ý rằng áp dụng cho các regex này, không bắt được so với lookahead. – TLP
Rõ ràng: nắm bắt lực lượng nhóm để sao chép dữ liệu và sau đó thay thế nhu cầu nội suy của '$ 1', trong khi regex thứ hai chỉ là tìm/kiểm tra/loại bỏ. Tuy nhiên, sự khác biệt về tốc độ phải là vô hình. – PSIAlt