If I have time, I'll benchmark it later.
I was already benchmarking for the other responses, so I did it for you.
Here is the code
Here is the results of this:#!/usr/bin/perl use strict; use warnings; use Benchmark qw(:all); use Carp::Assert; sub CarpAssert { my ($test) = @_; assert($test < 50) if DEBUG; return $test; } sub OrAssert { my ($test) = @_; ($test < 50) || die "Test is wrong"; return $test; } my @nums = map { ((rand() * 100) % 50) } (0 .. 100); cmpthese(10_000, { 'CarpAssert' => sub { eval { CarpAssert($_) } for (@nums) }, 'OrAssert' => sub { eval { OrAssert($_) } for (@nums) }, });
I then tried turning off Carp::Assert, and it was only 3% faster than the OR assertions.Benchmark: timing 10000 iterations of CarpAssert, OrAssert... CarpAssert: 11 wallclock secs ( 9.92 usr + 0.04 sys = 9.96 CPU) @ 10 +04.02/s (n=10000) OrAssert: 8 wallclock secs ( 7.14 usr + 0.03 sys = 7.17 CPU) @ 13 +94.70/s (n=10000) Rate CarpAssert OrAssert CarpAssert 1004/s -- -28% OrAssert 1395/s 39% --
I then changed the OR assertion to use a no-op error handler (as if they were off). Here is the modified subBenchmark: timing 10000 iterations of CarpAssert, OrAssert... CarpAssert: 9 wallclock secs ( 6.50 usr + 0.03 sys = 6.53 CPU) @ 15 +31.39/s (n=10000) OrAssert: 10 wallclock secs ( 6.72 usr + 0.02 sys = 6.74 CPU) @ 14 +83.68/s (n=10000) Rate OrAssert CarpAssert OrAssert 1484/s -- -3% CarpAssert 1531/s 3% --
And surprisingly it slowed OR downsub noOpError {} sub OrAssert { my ($test) = @_; ($test < 50) || noOpError("Test is wrong"); return $test; }
Benchmark: timing 10000 iterations of CarpAssert, OrAssert... CarpAssert: 6 wallclock secs ( 6.54 usr + 0.00 sys = 6.54 CPU) @ 15 +29.05/s (n=10000) OrAssert: 7 wallclock secs ( 7.11 usr + 0.02 sys = 7.13 CPU) @ 14 +02.52/s (n=10000) Rate OrAssert CarpAssert OrAssert 1403/s -- -8% CarpAssert 1529/s 9% --
An idea you might like to steal from it is to append if DEBUG to your assertions, where DEBUG is a constant that you can set to 1 in development/testing and to 0 in production. That way, you have all of the benefits of assertions in development, and none of the overhead in production (along with none of the benefits.)
Personally I do not like to turn off my assertions, I also see my debug statements as different from assertions. Besides IMO, having the if DEBUG at the end of the statement would really ruin the readability of it all.
In reply to Re^2: Being more Assert-ive with Perl
by stvn
in thread Being more Assert-ive with Perl
by stvn
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |