#!/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) }, });