I don't know that modifing Benchmark's cmpthese/timethese current behavior is neccessary, but a new method that supports interleaving might be usefull...
package Benchmark;
use List::Util qw(shuffle);
sub interleavethese{
# based on timethese, but it merges the results from several small
# iterations with the order shuffled each time.
my($n, $iters, $alt, $style) = @_;
die "usage: interleavethese(count, iters, { 'Name1'=>'code1', ...
+}\n"
unless ref $alt eq 'HASH';
my @names = sort keys %$alt;
$style = "" unless defined $style;
print "Benchmark: " unless $style eq 'none';
if ( $n > 0 ) {
croak "non-integer loopcount $n, stopped" if int($n)<$n;
print "timing $iters sets of $n iterations of" unless $style e
+q 'none';
} else {
print "running" unless $style eq 'none';
}
print " ", join(', ',@names) unless $style eq 'none';
unless ( $n > 0 ) {
my $for = n_to_for( $n );
print ", each for $iters iterations of at least $for CPU secon
+ds" unless $style eq 'none';
}
print "...\n" unless $style eq 'none';
my %results;
for (my $i = 0; $i < $iters; $i++) {
my @tasks = shuffle @names;
foreach my $name (@tasks) {
my $t = timethis ($n, $alt -> {$name}, $name, $style);
$results{$name} = exists $results{$name} ?
timesum($results{$name}, $t) : $t;
}
}
return \%results;
}
package main;
#use it like this...
use Benchmark qw[ cmpthese interleasethese ];
cmpthese(interleavethese(5, 3, {
Atest => \&test,
Btest => \&test,
Ctest => \&test,
}));
cmpthese(interleavethese(-5, 3, {
Atest => \&test,
Btest => \&test,
Ctest => \&test,
}));
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.