Not any more. This new smack is a lot faster by eliminating the alternation.
#!/usr/bin/perl -w
use Benchmark qw(cmpthese);
$s = "\bthis is an\b correct\b\b\b usage\b";
sub uk {
$a = $s;
$a =~ s[(?:[^\cH]\cH|^\cH)][]g while 1+index $a, chr(8);
$a;
}
sub new1 {
$a = $s;
while ($a =~ s/(?:[^\cH]\cH|^\cH+)//g) {}
$a;
}
sub smack {
$a = $s;
$a =~ s/^\cH+//;
1 while ($a =~ s/[^\cH]\cH//g);
$a;
}
cmpthese(-5,{uk=>\&uk,new1=>\&new1,smack=>\&smack});
$s x= 100;
cmpthese(-5,{uk=>\&uk,new1=>\&new1,smack=>\&smack});
Benchmark: running new1, smack, uk, each for at least 5 CPU seconds...
new1: 6 wallclock secs ( 5.39 usr + 0.03 sys = 5.42 CPU) @ 11
+344.28/s (n=61486)
smack: 6 wallclock secs ( 5.24 usr + 0.02 sys = 5.26 CPU) @ 36
+814.64/s (n=193645)
uk: 4 wallclock secs ( 5.26 usr + 0.06 sys = 5.32 CPU) @ 13
+261.09/s (n=70549)
Rate new1 uk smack
new1 11344/s -- -14% -69%
uk 13261/s 17% -- -64%
smack 36815/s 225% 178% --
Benchmark: running new1, smack, uk, each for at least 5 CPU seconds...
new1: 5 wallclock secs ( 5.22 usr + 0.05 sys = 5.27 CPU) @ 14
+0.04/s (n=738)
smack: 6 wallclock secs ( 5.26 usr + 0.07 sys = 5.33 CPU) @ 87
+3.55/s (n=4656)
uk: 5 wallclock secs ( 5.18 usr + 0.04 sys = 5.22 CPU) @ 17
+6.44/s (n=921)
Rate new1 uk smack
new1 140/s -- -21% -84%
uk 176/s 26% -- -80%
smack 874/s 524% 395% --
/-\