use strict; use warnings; use Benchmark qw/cmpthese/; my $string = (join '', 'a'..'z') x 10; my $unpack = sub { my @sub_fields = unpack '(A5)*', $string; }; my $regex1 = sub { my @sub_fields = $string =~ /\w{5}/g; }; my $regex2 = sub { my @sub_fields = $string =~ /.{5}/g; }; my $split = sub { # suggested by Kenosis my @sub_fields = split /.{5}\K/, $string; }; my $substr1 = sub { my @sub_fields; for ( my $i = 0 ; $i < length $string ; $i += 5 ) { push @sub_fields, substr $string, $i, 5; } }; my $substr2 = sub { my @sub_fields; my $max = (length $string)/5 -1; push @sub_fields, substr $string, $_*5, 5 for (0..$max); }; my $filehandle = sub { my (@sub_fields, $var); open my $FH, "<", \$string or die "cannot open $string $!"; push @sub_fields, $var while read $FH, $var, 5; }; my $c_style_string = sub { # the idea suggested by boftx my @sub_fields; my @chars = split //, $string; while (@chars) { push @sub_fields, join '', splice (@chars, 0, 5)}; }; cmpthese( -1, { regex1 => sub {$regex1->()}, regex2 => sub {$regex2->()}, unpack => sub {$unpack->()}, split => sub {$split->()}, substr1 => sub { $substr1->()}, substr2 => sub {$substr2->()}, FH => sub {$filehandle->()}, C_Style => sub { $c_style_string->()} } ) #### Rate C_Style regex1 regex2 FH split substr1 substr2 unpack C_Style 5598/s -- -72% -72% -78% -79% -80% -80% -83% regex1 19690/s 252% -- -1% -24% -28% -28% -31% -39% regex2 19968/s 257% 1% -- -23% -26% -27% -30% -38% FH 25984/s 364% 32% 30% -- -4% -5% -9% -20% split 27161/s 385% 38% 36% 5% -- -1% -5% -16% substr1 27355/s 389% 39% 37% 5% 1% -- -4% -16% substr2 28523/s 409% 45% 43% 10% 5% 4% -- -12% unpack 32428/s 479% 65% 62% 25% 19% 19% 14% --