use strict; use warnings; use Benchmark qw{ cmpthese timethese }; use Test::More qw{ no_plan }; my $fn = 'dna.txt'; unless ( -e $fn ) { open my $fh, '>', $fn; print $fh random_regex( '[ACTG]{42}' ), "\n" for 1 .. 1e6; } open my $inFH, q{<}, $fn or die $!; my $offset = 9; # Column 10 if numbering from 1 my @a = qw( 1 10 100 1000 10000 100000 1000000 ); sub method { seek $inFH, 0, 0; my $buffer = <$inFH>; my $lineLen = length $buffer; # my $nLines = 500; my $nLines = shift; my $chunkSize = $lineLen * $nLines; seek $inFH, 0, 0; my $retStr; my $mask = qq{\x00} x ${offset} . qq{\xff} . qq{\x00} x ( $lineLen - $offset - 1 ); $mask x= $nLines; while ( my $bytesRead = read $inFH, $buffer, $chunkSize ) { ( my $anded = $buffer & $mask ) =~ tr{\x00}{}d; $retStr .= $anded; } return \ $retStr; }; timethese( 3, { map { $_, "method( $_ )"} @a } );