sub insertQuarter {
my ($coin) = @_;
(defined($coin) && $coin == 25)
|| errorHandler(You must insert 25 cents");
initializeGame();
startGame();
}
####
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);
## -- Sub -----------------------------------------------------------
sub assert {
my $cond = shift;
$cond || die "Test is wrong";
}
sub SubAssert {
my ($test) = @_;
assert($test < 50);
return $test;
}
sub assertNoOp {}
sub SubAssertNoOp {
my ($test) = @_;
assertNoOp($test < 50);
return $test;
}
## -- OR ------------------------------------------------------------
# Plain Or assertions
sub OrAssert {
my ($test) = @_;
($test < 50) || die "Test is wrong";
return $test;
}
# Or assertion with a handler
sub errorHandler {
my $message = shift;
die $message;
}
sub OrAssertHandler {
my ($test) = @_;
($test < 50) || errorHandler("Test is wrong");
return $test;
}
# Or assertion with no-op handler (turned off)
sub NoOpErrorHandler {}
sub OrAssertHandlerNoOp {
my ($test) = @_;
($test < 50) || NoOpErrorHandler("Test is wrong");
return $test;
}
## -- test ----------------------------------------------------------
my @nums = map { ((rand() * 100) % 50) } (0 .. 100);
print(("-" x 80) . "\n");
print "Testing raw OR against sub\n";
print(("-" x 80) . "\n");
cmpthese(10_000, {
'SubAssert' => sub { eval { SubAssert($_) } for (@nums) },
'OrAssert' => sub { eval { OrAssert($_) } for (@nums) },
});
print(("-" x 80) . "\n");
print "Testing with OR Error Handler and raw sub\n";
print(("-" x 80) . "\n");
cmpthese(10_000, {
'SubAssert' => sub { eval { SubAssert($_) } for (@nums) },
'OrAssertHandler' => sub { eval { OrAssertHandler($_) } for (@nums) },
});
print(("-" x 80) . "\n");
print "Testing with no-op OR Error Handler and no-op sub (assertions off)\n";
print(("-" x 80) . "\n");
cmpthese(10_000, {
'SubAssertNoOp' => sub { eval { SubAssertNoOp($_) } for (@nums) },
'OrAssertHandlerNoOp' => sub { eval { OrAssertHandlerNoOp($_) } for (@nums) },
});
##
##
--------------------------------------------------------------------------------
Testing raw OR against sub
--------------------------------------------------------------------------------
Benchmark: timing 10000 iterations of OrAssert, SubAssert...
OrAssert: 8 wallclock secs ( 7.20 usr + 0.00 sys = 7.20 CPU) @ 1388.89/s (n=10000)
SubAssert: 11 wallclock secs (10.83 usr + 0.07 sys = 10.90 CPU) @ 917.43/s (n=10000)
Rate SubAssert OrAssert
SubAssert 917/s -- -34%
OrAssert 1389/s 51% --
--------------------------------------------------------------------------------
Testing with OR Error Handler and raw sub
--------------------------------------------------------------------------------
Benchmark: timing 10000 iterations of OrAssertHandler, SubAssert...
OrAssertHandler: 7 wallclock secs ( 7.12 usr + 0.06 sys = 7.18 CPU) @ 1392.76/s (n=10000)
SubAssert: 12 wallclock secs (10.56 usr + 0.12 sys = 10.68 CPU) @ 936.33/s (n=10000)
Rate SubAssert OrAssertHandler
SubAssert 936/s -- -33%
OrAssertHandler 1393/s 49% --
--------------------------------------------------------------------------------
Testing with no-op OR Error Handler and no-op sub (assertions off)
--------------------------------------------------------------------------------
Benchmark: timing 10000 iterations of OrAssertHandlerNoOp, SubAssertNoOp...
OrAssertHandlerNoOp: 8 wallclock secs ( 7.18 usr + 0.04 sys = 7.22 CPU) @ 1385.04/s (n=10000)
SubAssertNoOp: 10 wallclock secs ( 9.17 usr + 0.02 sys = 9.19 CPU) @ 1088.14/s (n=10000)
Rate SubAssertNoOp OrAssertHandlerNoOp
SubAssertNoOp 1088/s -- -21%
OrAssertHandlerNoOp 1385/s 27% --