#! perl -sw use 5.010; use strict; use Benchmark qw[ cmpthese ]; our $LEN ||= 100; our $string = 'A' x $LEN; our @chars = split//, $string; cmpthese -3, { substr => q[ our $string; for ( 0 .. length $string ) { my $c = substr $string, $_, 1; } ], pre_split => q[ our @chars; for my $c ( @chars ) { ; } ], split => q[ our $string; my @chars = split //, $string; for my $c ( @chars ) { } ], unpack => q[ our $string; for ( unpack 'C*', $string ) { my $c = chr; } ], chop => q[ our $string; my $copy = $string; while( my $c = chop $copy ) { ; } ], rev_chop => q[ our $string; my $copy = reverse $string; while( my $c = chop $copy ) { ; } ], }; __END__ C:\test>byChar.pl Rate split unpack substr rev_chop chop pre_split split 11018/s -- -74% -74% -81% -82% -94% unpack 42513/s 286% -- -0% -26% -30% -75% substr 42526/s 286% 0% -- -26% -30% -75% rev_chop 57794/s 425% 36% 36% -- -5% -66% chop 61056/s 454% 44% 44% 6% -- -64% pre_split 171734/s 1459% 304% 304% 197% 181% --