#! perl -slw use strict; use Benchmark ':all', ':hireswallclock'; my $x = "#@##@###@####@#####@"; my $y = reverse $x; my $z = "$x$x$x$y$y$x$x$y$y$y$y$y$x$x$x$x"; our %results; cmpthese -3, { unroll => sub { my @x = ([unroll($x)],[unroll($y)],[unroll($z)]); $results{ unroll } = \@x; }, rollahead => sub { my @x = ([rollahead($x)],[rollahead($y)],[rollahead($z)]); $results{ rollahead } = \@x; }, lookbehind => sub { my @x = ([lookbehind($x)],[lookbehind($y)],[lookbehind($z)]); $results{ lookbehind } = \@x; }, }; printf "%20s => %s\n", $_, "@{[ map{ qq[@$_] } @{ $results{ $_ } } ]}" for keys %results; sub unroll { my @x = $_[0] =~ /(?:^|@)((?:##|#@|[^#@])*)/g; for(@x){ $_ =~ s/##/#/g; $_ =~ s/#@/@/g; } @x } sub rollahead { my $x = shift; $x = reverse $x; my @x = reverse(split/\@(?=(?:##)*(?!#))/,$x,-1); for(@x){ $_ = reverse; $_ =~ s/##/#/g; $_ =~ s/#@/@/g; } @x } sub lookbehind { my $x = shift; split m[ (?: (?<=[^#]\#\#\#\#) | (?<=[^#]\#\#) | (?## C:\test>junk8 Rate unroll rollahead lookbehind unroll 3096/s -- -3% -33% rollahead 3175/s 3% -- -32% lookbehind 4639/s 50% 46% -- rollahead => @# #@## ##@ ##@## #@# # @# #@## ##@@# #@## ##@@# #@## ##@ ##@## #@# @##@## #@# # # #@## ##@@# #@## ##@ ##@## #@# @##@## #@# @##@## #@# @##@## #@# @##@## #@# # # #@## ##@@# #@## ##@@# #@## ##@@# #@## ##@ unroll => @# #@## ##@ ##@## #@# @# #@## ##@@# #@## ##@@# #@## ##@ ##@## #@# @##@## #@# # # #@## ##@@# #@## ##@ ##@## #@# @##@## #@# @##@## #@# @##@## #@# @##@## #@# # # #@## ##@@# #@## ##@@# #@## ##@@# #@## ##@ lookbehind => #@## ###@#### #####@ #####@#### ###@## # #@## ###@#### #####@#@## ###@#### #####@#@## ###@#### #####@ #####@#### ###@## #@#####@#### ###@## ## ## ###@#### #####@#@## ###@#### #####@ #####@#### ###@## #@#####@#### ###@## #@#####@#### ###@## #@#####@#### ###@## #@#####@#### ###@## ## ## ###@#### #####@#@## ###@#### #####@#@## ###@#### #####@#@## ###@#### #####@