Benchmark: running substr, vec for at least 60 CPU seconds... substr: 61 wallclock secs (62.41 usr + 0.02 sys = 62.42 CPU) @ 1.09/s (n=68) vec: 58 wallclock secs (60.64 usr + 0.02 sys = 60.66 CPU) @ 0.73/s (n=44) s/iter vec substr vec 1.38 -- -33% substr 0.918 50% -- #### use strict; use warnings; use Benchmark qw(cmpthese timethese); my %subs; ############################################################################### my $UPPER = 1_000_000; $subs{vec} = sub { my $sieve = ""; GUESS: for my $guess (2 .. $UPPER) { next GUESS if vec($sieve,$guess,1); #print "$guess\n"; for (my $mults = $guess * $guess; $mults <= $UPPER; $mults += $guess) { vec($sieve,$mults,1) = 1; } } }; $subs{substr} = sub { my $sieve = '0' x ($UPPER + 1); GUESS: for my $guess (2 .. $UPPER) { next GUESS if substr($sieve,$guess,1); #print "$guess\n"; for (my $mults = $guess * $guess; $mults <= $UPPER; $mults += $guess) { substr($sieve,$mults,1,1); } } }; ############################################################################### cmpthese(timethese(-60, \%subs));