$var = 'abc';
$var =~ s/b//; # $var is now 'ac'
$var =~ s/b//; # still 'ac' even before the s///
$var =~ s/b//; # yet another attempt to remove 'b' from 'ac'
$var =~ s/b//; # well, you get the point....
.... etc.
Here is a better benchmark (on 5.6.0) that restores my faith in tr///:
#!/usr/bin/perl -wT
use strict;
use Benchmark;
our $var;
$var = '\a\\aa\\\aaa\\\\aaaa'x100;
## rerun the original benchmarks to provide a baseline
timethese(100000, {
'old s' => sub { $var =~ s/\\//g },
'old tr' => sub { $var =~ tr/\\//d },
});
## try some new benchmarks that reinitialize $var each time
timethese(50000, {
'new s' => sub { $var = '\a\\aa\\\aaa\\\\aaaa'x100; $var =~ s/\\/
+/g },
'new tr' => sub { $var = '\a\\aa\\\aaa\\\\aaaa'x100; $var =~ tr/\\
+//d },
});
=OUTPUT
Benchmark: timing 100000 iterations of old s, old tr...
old s: 1 wallclock secs ( 0.56 usr + 0.00 sys = 0.56 CPU) @ 17
+8571.43/s (n=100000)
old tr: 2 wallclock secs ( 1.23 usr + 0.00 sys = 1.23 CPU) @ 81
+300.81/s (n=100000)
Benchmark: timing 50000 iterations of new s, new tr...
new s: 43 wallclock secs (30.81 usr + 0.02 sys = 30.83 CPU) @ 16
+21.80/s (n=50000)
new tr: 3 wallclock secs ( 2.06 usr + 0.00 sys = 2.06 CPU) @ 24
+271.84/s (n=50000)
-Blake
|