Dumbbench
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Dumbbench.pm view on Meta::CPAN
package Dumbbench;
use strict;
use warnings;
use Carp ();
use Time::HiRes ();
our $VERSION = '0.503';
require Dumbbench::Result;
require Dumbbench::Stats;
require Dumbbench::Instance;
use Params::Util '_INSTANCE';
use Class::XSAccessor {
getters => [qw(
target_rel_precision
target_abs_precision
initial_runs
max_iterations
variability_measure
started
outlier_rejection
subtract_dry_run
)],
accessors => [qw(verbosity)],
};
sub new {
my $proto = shift;
my $class = ref($proto)||$proto;
my $self;
if (not ref($proto)) {
$self = bless {
verbosity => 0,
target_rel_precision => 0.05,
target_abs_precision => 0,
initial_runs => 20,
max_iterations => 10000,
variability_measure => 'mad',
instances => [],
started => 0,
outlier_rejection => 3,
subtract_dry_run => 1,
@_,
} => $class;
}
else {
$self = bless {%$proto, @_} => $class;
my @inst = $self->instances;
$self->{instances} = [];
foreach my $instance (@inst) {
push @{$self->{instances}}, $instance->new;
}
}
if ($self->target_abs_precision <= 0 and $self->target_rel_precision <= 0) {
Carp::croak("Need either target_rel_precision or target_abs_precision > 0");
}
if ($self->initial_runs < 6) {
Carp::carp("Number of initial runs is very small (<6). Precision will be off.");
}
return $self;
}
sub add_instances {
my $self = shift;
if ($self->started) {
Carp::croak("Can't add instances after the benchmark has been started");
}
foreach my $instance (@_) {
if (not _INSTANCE($instance, 'Dumbbench::Instance')) {
Carp::croak("Argument to add_instances is not a Dumbbench::Instance");
}
}
push @{$self->{instances}}, @_;
}
sub instances {
my $self = shift;
return @{$self->{instances}};
}
sub run {
my $self = shift;
Carp::croak("Can't re-run same benchmark instance") if $self->started;
$self->dry_run_timings if $self->subtract_dry_run;
$self->run_timings;
}
sub run_timings {
my $self = shift;
$self->{started} = 1;
foreach my $instance ($self->instances) {
next if $instance->result;
$self->_run($instance);
}
}
sub dry_run_timings {
my $self = shift;
$self->{started} = 1;
foreach my $instance ($self->instances) {
next if $instance->dry_result;
$self->_run($instance, 'dry');
}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 4.320 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )