Come sempre, quando si vuole sapere quale dei due pezzi di codice funziona più velocemente, è necessario testarlo:
#!/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)//;
}
Il benchmark test tre casi diversi:
- Solo', '
- Solo', 0'
- 1% '0' , resto','
Sulla mia macchina e con la mia versione Perl, produce questi risultati:
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% --
Questi risultati comprovino l'ipotesi che la versione look-ahead è significativamente più veloce rispetto alla cattura, salvo il caso di quasi solo virgole. Ed è davvero poco sorprendente come già spiegato da PSIAlt nel suo commento.
saluti, Matthias
facendo alcuni test di benchmark sui due regex non può davvero determinare ogni grande differenza. Entrambi sono molto veloci. Nota che ciò si applica a queste regex, non a catturare vs lookahead. – TLP
È ovvio: acquisire forza di gruppo per copiare i dati e poi sostituirli richiede l'interpolazione di '$ 1', mentre la seconda regex è solo trovare/controllare/rimuovere. Tuttavia, la differenza di velocità dovrebbe essere invisibile. – PSIAlt