#!/usr/bin/perl -w use strict; use Benchmark qw( cmpthese ); sub blockold { my $fh; open $fh, 'vsfull.csv'; #binmode $fh; my @lines; my $block; my $left= ''; while( read $fh, $block, 8192 ) { $block = $left . $block; my $i = index $block, "\n"; while($i > 0){ push @lines, substr($block,0,$i); substr $block, 0, $i+1, ''; $i = index $block, "\n"; } $left = $block; } return @lines; } sub blockfix { my $fh; open $fh, 'vsfull.csv'; my @lines; my $block; my $left= ''; while( read $fh, $block, 8192 ) { $block = $left . $block; my $i = index $block, "\n"; while( $i >= 0 ) { push @lines, substr($block,0,$i+1); substr $block, 0, $i+1, ''; $i = index $block, "\n"; } $left = $block; } return @lines; } sub blocknew { my $fh; open $fh, 'vsfull.csv'; my @lines; my $block= ''; while( read $fh, $block, 8192, length $block ) { my $i; my $j= 0; while( $i= 1 + index $block, "\n", $j ) { push @lines, substr $block, $j, $i-$j; $j= $i; } substr( $block, 0, $j )= ''; } return @lines; } sub splitnew { my $fh; open $fh, 'vsfull.csv'; my @lines; my $block= ''; while( read $fh, $block, 8192, length $block ) { push @lines, split /(?<=\n)/, $block, -1; $block= pop @lines; } push @lines, $block if length $block; return @lines; } sub lineold { my $fh; my @lines; open $fh, 'vsfull.csv'; while(<$fh>){ push @lines, $_; } return @lines; } sub linenew { my $fh; my @lines; open $fh, 'vsfull.csv'; @lines= <$fh>; return @lines; } my @bo= blockold(); my @bf= blockfix(); my @bn= blocknew(); my @lo= lineold(); my @ln= linenew(); my @sn= splitnew(); warn "blockold is broken!\n" if "@bo" ne "@ln"; warn "blockfix is broken!\n" if "@bf" ne "@ln"; warn "blocknew is broken!\n" if "@bn" ne "@ln"; warn "lineold is broken!\n" if "@lo" ne "@ln"; warn "splitnew is broken!\n" if "@sn" ne "@ln"; cmpthese( -3, { lo => \&lineold, ln => \&linenew, bo => \&blockold, bn => \&blocknew, bf => \&blockfix, sn => \&splitnew, });