#!/usr/bin/perl
use strict;
use Benchmark;
use Data::Dumper;
use List::Util qw (sum);
use List::MoreUtils qw (true);
my $Test_Results = {};
my @Test_Cases = (
[qw (0 0 0 0 000)], [qw (0 0 1 1 001)],
[qw (0 1 0 1 010)], [qw (0 1 1 0 011)],
[qw (1 0 0 1 100)], [qw (1 0 1 0 101)],
[qw (1 1 0 0 110)], [qw (1 1 1 0 111)],
);
my $test_result_timings = timethese(500000, {
'a_null_sub' => sub { test_framework('a_null_sub', \&a_null_sub); },
'snowhare1' => sub { test_framework('snowhare1', \&snowhare1); },
'snowhare2' => sub { test_framework('snowhare2', \&snowhare2); },
'snowhare3' => sub { test_framework('snowhare3', \&snowhare3); },
'snowhare4' => sub { test_framework('snowhare4', \&snowhare4); },
'snowhare5' => sub { test_framework('snowhare5', \&snowhare5); },
'snowhare6' => sub { test_framework('snowhare6', \&snowhare6); },
'saintmike1' => sub { test_framework('saintmike1', \&saintmike1); },
'saintmike2' => sub { test_framework('saintmike2', \&saintmike2); },
'tye1' => sub { test_framework('tye1', \&tye1); },
'tye2' => sub { test_framework('tye2', \&tye2); },
'ph713_1' => sub { test_framework('ph713_1', \&ph713_1); },
'tanktalus1' => sub { test_framework('tanktalus1', \&tanktalus1); },
'davido1' => sub { test_framework('davido1', \&davido1); },
'ikegami1' => sub { test_framework('ikegami1', \&ikegami1); },
'strat1' => sub { test_framework('strat1', \&strat1); },
'strat2' => sub { test_framework('strat2', \&strat2); },
'jamesnc1' => sub { test_framework('jamesnc1', \&jamesnc1); },
}
);
my $tare_timing = $test_result_timings->{'a_null_sub'};
my @result_ids = sort keys %$test_result_timings;
my $compensated_results = {};
my $fastest;
my %error_results = ();
foreach my $result_label (@result_ids) {
next if ($result_label eq 'a_null_sub');
my $result_timing = $test_result_timings->{$result_label};
my $compensated_time = timediff($result_timing, $tare_timing);
my $cpu_secs = $compensated_time->[1];
$compensated_results->{$result_label} = $cpu_secs;
if (defined $fastest) {
if ($cpu_secs < $compensated_results->{$fastest}) {
$fastest = $result_label;
}
} else {
$fastest = $result_label;
}
foreach my $test_case (@Test_Cases) {
my $test_pattern = $test_case->[5];
$error_results{$result_label} += $Test_Results->{$result_label}->{$test_pattern};
}
}
my $fastest_result = $compensated_results->{$fastest};
my @sorted_result_ids = sort { $compensated_results->{$a} <=> $compensated_results->{$b} } keys %$compensated_results;
foreach my $final_result_id (@sorted_result_ids) {
my $cpu_secs = $compensated_results->{$final_result_id};
printf "%20s : %5.2f secs %5.0f\% (%s errors)\n", $final_result_id, $cpu_secs, (100 * $cpu_secs / $fastest_result), $error_results{$final_result_id};
}
exit;
###
sub test_framework {
my ($test_id, $test_sub) = @_;
foreach my $test_case (@Test_Cases) {
$Test_Results->{$test_id}->{$test_case->[5]} = ($test_case->[3] ^ &$test_sub($test_case->[0],$test_case->[1],$test_case->[2])) ? 1 : 0;
}
}
###
sub a_null_sub {
return 0;
}
sub snowhare1 {
return 1 == ($_[0] ? 1 : 0) + ($_[1] ? 1 : 0) + ($_[2] ? 1 :0);
}
sub snowhare2 {
return 2 == (! $_[0]) + (! $_[1]) + (! $_[2]);
}
sub snowhare3 {
return ($_[0] || $_[1] || $_[2]) && (! ($_[0] && $_[1])) && (! ($_[1] && $_[2])) && (! ($_[2] && $_[0]));
}
sub snowhare4 {
return (! ($_[0] && $_[1] && $_[2])) && ($_[0] ^ $_[1] ^ $_[2]);
}
sub snowhare5 {
use integer;
return 1 == ($_[0] ? 1 : 0) + ($_[1] ? 1 : 0) + ($_[2] ? 1 :0);
}
sub snowhare6 {
use integer;
return 2 == (! $_[0]) + (! $_[1]) + (! $_[2]);
}
sub saintmike2 {
return 1 == (grep {$_} $_[0],$_[1],$_[2]);
}
sub saintmike1 {
my $count = 0;
$_[0] && $count++;
$_[1] && $count++;
$_[2] && $count++;
return 1 == $count;
}
sub tye1 {
return 1 == grep $_, $_[0], $_[1], $_[2];
}
sub tye2 {
return 1 == !!$_[0] + !!$_[1] + !!$_[2];
}
sub ph713_1 {
return 1 == sum( map { !!$_ } @_);
}
sub tanktalus1 {
return 1 == sum( map { $_ ? 1 : 0 } @_ );
}
sub davido1 {
return 1 == true { $_ } @_;
}
sub ikegami1 {
my $count = 0;
$_ && $count++ foreach @_;
return $count == 1;
}
sub strat1 {
my $count = 0;
$_ and $count++ for (@_);
return 1 == $count;
}
sub strat2 {
1 == do {my $cnt=0; $_ and $cnt++ for (@_); $cnt }
}
sub jamesnc1 {
my $t = 1;
for (@_) { $t = $t<<1 if $_; }
return 2 == $t;
}
####
snowhare6 : 3.76 secs 100% (0 errors)
snowhare2 : 3.90 secs 104% (0 errors)
tye2 : 4.06 secs 108% (0 errors)
snowhare3 : 4.09 secs 109% (0 errors)
snowhare5 : 4.13 secs 110% (0 errors)
snowhare1 : 4.73 secs 126% (0 errors)
saintmike1 : 5.51 secs 147% (0 errors)
tye1 : 5.62 secs 149% (0 errors)
snowhare4 : 5.69 secs 151% (0 errors)
saintmike2 : 6.37 secs 169% (0 errors)
strat1 : 10.60 secs 282% (0 errors)
ikegami1 : 11.14 secs 296% (0 errors)
tanktalus1 : 11.68 secs 311% (0 errors)
strat2 : 11.81 secs 314% (0 errors)
jamesnc1 : 12.07 secs 321% (0 errors)
ph713_1 : 15.60 secs 415% (0 errors)
davido1 : 16.18 secs 430% (0 errors)
####
snowhare6 : 3.76 secs 100% (0 errors)
snowhare2 : 3.90 secs 104% (0 errors)
tye2 : 4.06 secs 108% (0 errors)
snowhare3 : 4.09 secs 109% (0 errors)
snowhare5 : 4.13 secs 110% (0 errors)
snowhare1 : 4.73 secs 126% (0 errors)
saintmike1 : 5.51 secs 147% (0 errors)
tye1 : 5.62 secs 149% (0 errors)
snowhare4 : 5.69 secs 151% (0 errors)
saintmike2 : 6.37 secs 169% (0 errors)
strat1 : 10.60 secs 282% (0 errors)
ikegami1 : 11.14 secs 296% (0 errors)
tanktalus1 : 11.68 secs 311% (0 errors)
strat2 : 11.81 secs 314% (0 errors)
jamesnc1 : 12.07 secs 321% (0 errors)
ph713_1 : 15.60 secs 415% (0 errors)
davido1 : 16.18 secs 430% (0 errors)