|
Packit Service |
d54d9c |
#!/usr/bin/perl
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
use strict ;
|
|
Packit |
be8974 |
use warnings ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
use Getopt::Long ;
|
|
Packit |
be8974 |
use Benchmark qw( timethese cmpthese ) ;
|
|
Packit |
be8974 |
use Carp ;
|
|
Packit |
be8974 |
use FileHandle ;
|
|
Packit |
be8974 |
use Fcntl qw( :DEFAULT :seek );
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
use File::Slurp () ;
|
|
Packit |
be8974 |
use FileSlurp_12 () ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $file_name = 'slurp_data' ;
|
|
Packit |
be8974 |
my( @lines, $text ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my %opts ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
parse_options() ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
run_benchmarks() ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
unlink $file_name ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
exit ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub run_benchmarks {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
foreach my $size ( @{$opts{size_list}} ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
@lines = ( 'a' x 80 . "\n") x ( $size / 81 + 1 ) ;
|
|
Packit |
be8974 |
$text = join( '', @lines ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $overage = length($text) - $size ;
|
|
Packit |
be8974 |
substr( $text, -$overage, $overage, '' ) ;
|
|
Packit |
be8974 |
substr( $lines[-1], -$overage, $overage, '' ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
if ( $opts{slurp} ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
File::Slurp::write_file( $file_name, $text ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
bench_list_slurp( $size ) if $opts{list} ;
|
|
Packit |
be8974 |
bench_scalar_slurp( $size ) if $opts{scalar} ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
if ( $opts{spew} ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
bench_spew_list( $size ) if $opts{list} ;
|
|
Packit |
be8974 |
bench_scalar_spew( $size ) if $opts{scalar} ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
##########################################
|
|
Packit |
be8974 |
##########################################
|
|
Packit |
be8974 |
sub bench_scalar_slurp {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my ( $size ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
print "\n\nReading (Slurp) into a scalar: Size = $size bytes\n\n" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $buffer ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $result = timethese( $opts{iterations}, {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
'FS::read_file' =>
|
|
Packit |
be8974 |
sub { my $text = File::Slurp::read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
'FS12::read_file' =>
|
|
Packit |
be8974 |
sub { my $text = FileSlurp_12::read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
'FS::read_file_buf_ref' =>
|
|
Packit |
be8974 |
sub { my $text ;
|
|
Packit |
be8974 |
File::Slurp::read_file( $file_name, buf_ref => \$text ) },
|
|
Packit |
be8974 |
'FS::read_file_buf_ref2' =>
|
|
Packit |
be8974 |
sub {
|
|
Packit |
be8974 |
File::Slurp::read_file( $file_name, buf_ref => \$buffer ) },
|
|
Packit |
be8974 |
'FS::read_file_scalar_ref' =>
|
|
Packit |
be8974 |
sub { my $text =
|
|
Packit |
be8974 |
File::Slurp::read_file( $file_name, scalar_ref => 1 ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
old_sysread_file =>
|
|
Packit |
be8974 |
sub { my $text = old_sysread_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
old_read_file =>
|
|
Packit |
be8974 |
sub { my $text = old_read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
orig_read_file =>
|
|
Packit |
be8974 |
sub { my $text = orig_read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
orig_slurp =>
|
|
Packit |
be8974 |
sub { my $text = orig_slurp_scalar( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
file_contents =>
|
|
Packit |
be8974 |
sub { my $text = file_contents( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
file_contents_no_OO =>
|
|
Packit |
be8974 |
sub { my $text = file_contents_no_OO( $file_name ) },
|
|
Packit |
be8974 |
} ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
cmpthese( $result ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
##########################################
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub bench_list_slurp {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my ( $size ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
print "\n\nReading (Slurp) into a list: Size = $size bytes\n\n" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $result = timethese( $opts{iterations}, {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
'FS::read_file' =>
|
|
Packit |
be8974 |
sub { my @lines = File::Slurp::read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
'FS::read_file_array_ref' =>
|
|
Packit |
be8974 |
sub { my $lines_ref =
|
|
Packit |
be8974 |
File::Slurp::read_file( $file_name, array_ref => 1 ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
'FS::read_file_scalar' =>
|
|
Packit |
be8974 |
sub { my $lines_ref =
|
|
Packit |
be8974 |
[ File::Slurp::read_file( $file_name ) ] },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
old_sysread_file =>
|
|
Packit |
be8974 |
sub { my @lines = old_sysread_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
old_read_file =>
|
|
Packit |
be8974 |
sub { my @lines = old_read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
orig_read_file =>
|
|
Packit |
be8974 |
sub { my @lines = orig_read_file( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
orig_slurp_array =>
|
|
Packit |
be8974 |
sub { my @lines = orig_slurp_array( $file_name ) },
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
orig_slurp_array_ref =>
|
|
Packit |
be8974 |
sub { my $lines_ref = orig_slurp_array( $file_name ) },
|
|
Packit |
be8974 |
} ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
cmpthese( $result ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
######################################
|
|
Packit |
be8974 |
# uri's old fast slurp
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub old_read_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name ) = shift ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, $file_name ) || carp "can't open $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
return <FH> if wantarray ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $buf ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
read( FH, $buf, -s FH ) ;
|
|
Packit |
be8974 |
return $buf ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub old_sysread_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name ) = shift ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, $file_name ) || carp "can't open $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
return <FH> if wantarray ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $buf ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sysread( FH, $buf, -s FH ) ;
|
|
Packit |
be8974 |
return $buf ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
######################################
|
|
Packit |
be8974 |
# from File::Slurp.pm on cpan
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub orig_read_file
|
|
Packit |
be8974 |
{
|
|
Packit |
be8974 |
my ($file) = @_;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local($/) = wantarray ? $/ : undef;
|
|
Packit |
be8974 |
local(*F);
|
|
Packit |
be8974 |
my $r;
|
|
Packit |
be8974 |
my (@r);
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
open(F, "<$file") || croak "open $file: $!";
|
|
Packit |
be8974 |
@r = <F>;
|
|
Packit |
be8974 |
close(F) || croak "close $file: $!";
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
return $r[0] unless wantarray;
|
|
Packit |
be8974 |
return @r;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
######################################
|
|
Packit |
be8974 |
# from Slurp.pm on cpan
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub orig_slurp {
|
|
Packit |
be8974 |
local( $/, @ARGV ) = ( wantarray ? $/ : undef, @_ );
|
|
Packit |
be8974 |
return <ARGV>;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub orig_slurp_array {
|
|
Packit |
be8974 |
my @array = orig_slurp( @_ );
|
|
Packit |
be8974 |
return wantarray ? @array : \@array;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub orig_slurp_scalar {
|
|
Packit |
be8974 |
my $scalar = orig_slurp( @_ );
|
|
Packit |
be8974 |
return $scalar;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
######################################
|
|
Packit |
be8974 |
# very slow slurp code used by a client
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub file_contents {
|
|
Packit |
be8974 |
my $file = shift;
|
|
Packit |
be8974 |
my $fh = new FileHandle $file or
|
|
Packit |
be8974 |
warn("Util::file_contents:Can't open file $file"), return '';
|
|
Packit |
be8974 |
return join '', <$fh>;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
# same code but doesn't use FileHandle.pm
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub file_contents_no_OO {
|
|
Packit |
be8974 |
my $file = shift;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, $file ) || carp "can't open $file $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
return join '', <FH>;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
##########################################
|
|
Packit |
be8974 |
##########################################
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub bench_spew_list {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $size ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
print "\n\nWriting (Spew) a list of lines: Size = $size bytes\n\n" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $result = timethese( $opts{iterations}, {
|
|
Packit |
be8974 |
'FS::write_file' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
File::Slurp::write_file( $file_name, @lines ) },
|
|
Packit |
be8974 |
'FS::write_file Aref' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
File::Slurp::write_file( $file_name, \@lines ) },
|
|
Packit |
be8974 |
'print' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
print_file( $file_name, @lines ) },
|
|
Packit |
be8974 |
'print/join' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
print_join_file( $file_name, @lines ) },
|
|
Packit |
be8974 |
'syswrite/join' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
syswrite_join_file( $file_name, @lines ) },
|
|
Packit |
be8974 |
'original write_file' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
orig_write_file( $file_name, @lines ) },
|
|
Packit |
be8974 |
} ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
cmpthese( $result ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub print_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name ) = shift ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
print FH @_ ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub print_join_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name ) = shift ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
print FH join( '', @_ ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub syswrite_join_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name ) = shift ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
syswrite( FH, join( '', @_ ) ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub sysopen_syswrite_join_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name ) = shift ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
sysopen( FH, $file_name, O_WRONLY | O_CREAT ) ||
|
|
Packit |
be8974 |
carp "can't create $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
syswrite( FH, join( '', @_ ) ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub orig_write_file
|
|
Packit |
be8974 |
{
|
|
Packit |
be8974 |
my ($f, @data) = @_;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local(*F);
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
open(F, ">$f") || croak "open >$f: $!";
|
|
Packit |
be8974 |
(print F @data) || croak "write $f: $!";
|
|
Packit |
be8974 |
close(F) || croak "close $f: $!";
|
|
Packit |
be8974 |
return 1;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
##########################################
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub bench_scalar_spew {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my ( $size ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
print "\n\nWriting (Spew) a scalar: Size = $size bytes\n\n" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $result = timethese( $opts{iterations}, {
|
|
Packit |
be8974 |
'FS::write_file' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
File::Slurp::write_file( $file_name, $text ) },
|
|
Packit |
be8974 |
'FS::write_file Sref' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
File::Slurp::write_file( $file_name, \$text ) },
|
|
Packit |
be8974 |
'print' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
print_file( $file_name, $text ) },
|
|
Packit |
be8974 |
'syswrite_file' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
syswrite_file( $file_name, $text ) },
|
|
Packit |
be8974 |
'syswrite_file_ref' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
syswrite_file_ref( $file_name, \$text ) },
|
|
Packit |
be8974 |
'orig_write_file' => sub { unlink $file_name if $opts{unlink} ;
|
|
Packit |
be8974 |
orig_write_file( $file_name, $text ) },
|
|
Packit |
be8974 |
} ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
cmpthese( $result ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub syswrite_file {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name, $text ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
syswrite( FH, $text ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub syswrite_file_ref {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $file_name, $text_ref ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
local( *FH ) ;
|
|
Packit |
be8974 |
open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
syswrite( FH, ${$text_ref} ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub parse_options {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my $result = GetOptions (\%opts, qw(
|
|
Packit |
be8974 |
iterations|i=s
|
|
Packit |
be8974 |
direction|d=s
|
|
Packit |
be8974 |
context|c=s
|
|
Packit |
be8974 |
sizes|s=s
|
|
Packit |
be8974 |
unlink|u
|
|
Packit |
be8974 |
legend|key|l|k
|
|
Packit |
be8974 |
help|usage
|
|
Packit |
be8974 |
) ) ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
usage() unless $result ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
usage() if $opts{help} ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
legend() if $opts{legend} ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
# set defaults
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{direction} ||= 'both' ;
|
|
Packit |
be8974 |
$opts{context} ||= 'both' ;
|
|
Packit |
be8974 |
$opts{iterations} ||= -2 ;
|
|
Packit |
be8974 |
$opts{sizes} ||= '512,10k,1m' ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
if ( $opts{direction} eq 'both' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{spew} = 1 ;
|
|
Packit |
be8974 |
$opts{slurp} = 1 ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
elsif ( $opts{direction} eq 'in' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{slurp} = 1 ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
elsif ( $opts{direction} eq 'out' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{spew} = 1 ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
else {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
usage( "Unknown direction: $opts{direction}" ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
if ( $opts{context} eq 'both' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{list} = 1 ;
|
|
Packit |
be8974 |
$opts{scalar} = 1 ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
elsif ( $opts{context} eq 'scalar' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{scalar} = 1 ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
elsif ( $opts{context} eq 'list' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{list} = 1 ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
else {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
usage( "Unknown context: $opts{context}" ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
if ( $opts{context} eq 'both' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{list} = 1 ;
|
|
Packit |
be8974 |
$opts{scalar} = 1 ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
elsif ( $opts{context} eq 'scalar' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{scalar} = 1 ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
elsif ( $opts{context} eq 'list' ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$opts{list} = 1 ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
else {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
usage( "Unknown context: $opts{context}" ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
foreach my $size ( split ',', ( $opts{sizes} ) ) {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
# check for valid size and suffix. grab both.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
usage( "Illegal size: $size") unless $size =~ /^(\d+)([km])?$/ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
# handle suffix multipliers
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$size = $1 * (( $2 eq 'k' ) ? 1024 : 1024*1024) if $2 ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
push( @{$opts{size_list}}, $size ) ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
#use Data::Dumper ;
|
|
Packit |
be8974 |
#print Dumper \%opts ;
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub legend {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
die <<'LEGEND' ;
|
|
Packit |
be8974 |
--------------------------------------------------------------------------
|
|
Packit |
be8974 |
Legend for the Slurp Benchmark Entries
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
In all cases below 'FS' or 'F::S' means the current File::Slurp module
|
|
Packit |
be8974 |
is being used in the benchmark. The full name and description will say
|
|
Packit |
be8974 |
which options are being used.
|
|
Packit |
be8974 |
--------------------------------------------------------------------------
|
|
Packit |
be8974 |
These benchmarks write a list of lines to a file. Use the direction option
|
|
Packit |
be8974 |
of 'out' or 'both' and the context option is 'list' or 'both'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
Key Description/Source
|
|
Packit |
be8974 |
----- --------------------------
|
|
Packit |
be8974 |
FS::write_file Current F::S write_file
|
|
Packit |
be8974 |
FS::write_file Aref Current F::S write_file on array ref of data
|
|
Packit |
be8974 |
print Open a file and call print() on the list data
|
|
Packit |
be8974 |
print/join Open a file and call print() on the joined list
|
|
Packit |
be8974 |
data
|
|
Packit |
be8974 |
syswrite/join Open a file, call syswrite on joined list data
|
|
Packit |
be8974 |
sysopen/syswrite Sysopen a file, call syswrite on joined list
|
|
Packit |
be8974 |
data
|
|
Packit |
be8974 |
original write_file write_file code from original File::Slurp
|
|
Packit |
be8974 |
(pre-version 9999.*)
|
|
Packit |
be8974 |
--------------------------------------------------------------------------
|
|
Packit |
be8974 |
These benchmarks write a scalar to a file. Use the direction option
|
|
Packit |
be8974 |
of 'out' or 'both' and the context option is 'scalar' or 'both'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
Key Description/Source
|
|
Packit |
be8974 |
----- --------------------------
|
|
Packit |
be8974 |
FS::write_file Current F::S write_file
|
|
Packit |
be8974 |
FS::write_file Sref Current F::S write_file of scalar ref of data
|
|
Packit |
be8974 |
print Open a file and call print() on the scalar data
|
|
Packit |
be8974 |
syswrite_file Open a file, call syswrite on scalar data
|
|
Packit |
be8974 |
syswrite_file_ref Open a file, call syswrite on scalar ref of
|
|
Packit |
be8974 |
data
|
|
Packit |
be8974 |
orig_write_file write_file code from original File::Slurp
|
|
Packit |
be8974 |
(pre-version 9999.*)
|
|
Packit |
be8974 |
--------------------------------------------------------------------------
|
|
Packit |
be8974 |
These benchmarks slurp a file into an array. Use the direction option
|
|
Packit |
be8974 |
of 'in' or 'both' and the context option is 'list' or 'both'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
Key Description/Source
|
|
Packit |
be8974 |
----- --------------------------
|
|
Packit |
be8974 |
FS::read_file Current F::S read_file - returns array
|
|
Packit |
be8974 |
FS::read_file_array_ref Current F::S read_file - returns array
|
|
Packit |
be8974 |
ref in any context
|
|
Packit |
be8974 |
FS::read_file_scalar Current F::S read_file - returns array
|
|
Packit |
be8974 |
ref in scalar context
|
|
Packit |
be8974 |
old_sysread_file My old fast slurp - calls sysread
|
|
Packit |
be8974 |
old_read_file My old fast slurp - calls read
|
|
Packit |
be8974 |
orig_read_file Original File::Slurp on CPAN
|
|
Packit |
be8974 |
orig_slurp_array Slurp.pm on CPAN - returns array
|
|
Packit |
be8974 |
orig_slurp_array_ref Slurp.pm on CPAN - returns array ref
|
|
Packit |
be8974 |
--------------------------------------------------------------------------
|
|
Packit |
be8974 |
These benchmarks slurp a file into a scalar. Use the direction option
|
|
Packit |
be8974 |
of 'in' or 'both' and the context option is 'scalar' or 'both'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
Key Description/Source
|
|
Packit |
be8974 |
----- --------------------------
|
|
Packit |
be8974 |
FS::read_file Current F::S read_file - returns scalar
|
|
Packit |
be8974 |
FS12::read_file F::S .12 slower read_file -
|
|
Packit |
be8974 |
returns scalar
|
|
Packit |
be8974 |
FS::read_file_buf_ref Current F::S read_file - returns
|
|
Packit |
be8974 |
via buf_ref argument - new buffer
|
|
Packit |
be8974 |
FS::read_file_buf_ref2 Current F::S read_file - returns
|
|
Packit |
be8974 |
via buf_ref argument - uses
|
|
Packit |
be8974 |
existing buffer
|
|
Packit |
be8974 |
FS::read_file_scalar_ref Current F::S read_file - returns a
|
|
Packit |
be8974 |
scalar ref
|
|
Packit |
be8974 |
old_sysread_file My old fast slurp - calls sysread
|
|
Packit |
be8974 |
old_read_file My old fast slurp - calls read
|
|
Packit |
be8974 |
orig_read_file Original File::Slurp on CPAN
|
|
Packit |
be8974 |
orig_slurp Slurp.pm on CPAN
|
|
Packit |
be8974 |
file_contents Very slow slurp code done by a client
|
|
Packit |
be8974 |
file_contents_no_OO Same code but doesn't use FileHandle.pm
|
|
Packit |
be8974 |
--------------------------------------------------------------------------
|
|
Packit |
be8974 |
LEGEND
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
sub usage {
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
my( $err ) = @_ ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
$err ||= '' ;
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
die <
|
|
Packit |
be8974 |
$err
|
|
Packit |
be8974 |
Usage: $0 [--iterations=<iter>] [--direction=<dir>] [--context=<con>]
|
|
Packit |
be8974 |
[--sizes=<size_list>] [--legend] [--help]
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--iterations=<iter> Run the benchmarks this many iterations
|
|
Packit |
be8974 |
-i=<iter> A positive number is iteration count,
|
|
Packit |
be8974 |
a negative number is minimum CPU time in
|
|
Packit |
be8974 |
seconds. Default is -2 (run for 2 CPU seconds).
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--direction=<dir> Which direction to slurp: 'in', 'out' or 'both'.
|
|
Packit |
be8974 |
-d=<dir> Default is 'both'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--context=<con> Which context is used for slurping: 'list',
|
|
Packit |
be8974 |
-c=<con> 'scalar' or 'both'. Default is 'both'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--sizes=<size_list> What sizes will be used in slurping (either
|
|
Packit |
be8974 |
-s=<size_list> direction). This is a comma separated list of
|
|
Packit |
be8974 |
integers. You can use 'k' or 'm' as suffixes
|
|
Packit |
be8974 |
for 1024 and 1024**2. Default is '512,10k,1m'.
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--unlink Unlink the written file before each time
|
|
Packit |
be8974 |
-u a file is written
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--legend Print out a legend of all the benchmark entries.
|
|
Packit |
be8974 |
--key
|
|
Packit |
be8974 |
-l
|
|
Packit |
be8974 |
-k
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
--help Print this help text
|
|
Packit |
be8974 |
--usage
|
|
Packit |
be8974 |
DIE
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
}
|
|
Packit |
be8974 |
|
|
Packit |
be8974 |
__END__
|
|
Packit |
be8974 |
|