1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#! /usr/bin/perl
use XML::Dumper;
use Benchmark qw( timeit timestr );
print
"This is a test to see how quickly XML::Dumper runs on your system. \n",
"This will take a few minutes\n\n";
my $count = 100;
my $data = [];
my $timemax = 0;
my $timemin = 100;
for my $size ( qw( 1 10 20 50 100 200 500 1000 )) {
my $perl = [ map {{ id => $_, data => rand( 1000 ), uncertainty => rand( 100 ) }} ( 0 .. $size ) ];
print "Testing XML of size: $size...";
my $t = timeit( $count, sub {
$xml = pl2xml( $perl );
$pl = xml2pl( $xml );
}
);
my $time = int( timestr( $t ))/$count;
print timestr( $t ), " ($time each)\n";
$timemax = $time > $timemax ? $time : $timemax;
$timemin = $time < $timemin ? $time : $timemin;
push @$data, {
size => $size,
time => $time,
count => $count
};
}
print "\n\n";
($timemax, $timemin) = ( log10( $timemax ), log10( $timemin ) );
my $range = $timemax - $timemin;
my $v_size = $range/20;
my $v_span = $timemax;
print "time (log s)\n";
while( $v_span >= $timemin ) {
printf( "%8.4f (%4.2f) |", $v_span, 10**$v_span );
foreach( @$data ) {
print log10( $_->{ time } ) >= $v_span ? "* " : " ";
}
print "\n";
$v_span -= $v_size;
}
print '-' x 80, "\n";
print " ";
foreach( @$data ) {
printf( "%-4d ", $_->{ size } );
}
print "\n\n";
my @stats = reverse @$data;
my $first = shift @stats;
my $sum = $first->{ time }/$first->{ size };
my $count = 1;
foreach( @stats ) {
$time = $_->{ time } / $_->{ size };
# Skip outliers
next if( $time <= $sum * 0.5 || $time >= $sum * 2 );
$sum += $time;
$count++;
}
printf( "%-02.6f seconds per XML record size.\n\n", $sum/$count );
sub log10 {
my $num = shift;
return -2 if $num == 0;
return log($num)/log(10);
}
__END__
=head1 NAME
profile.pl - test how quickly XML::Dumper runs on your system
|