дори и да включа split при образуването на масива, с който се тества, какво от това??? не защитавам теорията с употребата на масив, а оборвам твоята, която е в пъти по-бавна от регулярния тест:
my $result = timethese(5_000_000, {
'equal_full' => '@main::array_full = split //, $main::string; $main::buffer eq $_ or last for @main::array_full;',
'equal_part' => '@main::array_part = qw(a b a a a a a a a a); $main::buffer eq $_ or last for @main::array_part;',
'regex' => '$main::string =~ /^\Q$main::buffer\E+$/o',
'substr' => 'for (0..length($main::string)) {
if (substr($main::string,$_,1) ne $main::buffer) {
$main::same=0;
last;
}
}',
});
__END__
stdout:
Benchmark: timing 5000000 iterations of equal_full, equal_part, regex, substr...
equal_full: 46 wallclock secs (39.19 usr + 0.00 sys = 39.19 CPU) @ 127583.57/s (n=5000000)
equal_part: 23 wallclock secs (21.37 usr + 0.00 sys = 21.37 CPU) @ 233972.86/s (n=5000000)
regex: 5 wallclock secs ( 3.74 usr + 0.00 sys = 3.74 CPU) @ 1336898.40/s (n=5000000)
substr: 24 wallclock secs (22.01 usr + 0.00 sys = 22.01 CPU) @ 227169.47/s (n=5000000)
Rate equal_full substr equal_part regex
equal_full 127584/s -- -44% -45% -90%
substr 227169/s 78% -- -3% -83%
equal_part 233973/s 83% 3% -- -82%
regex 1336898/s 948% 489% 471% --