sub switch{ eval{ goto "case_$_[0]" } or goto default; }
for my $expr ( 1 .. 10, 'fred' ) {
switch( $expr ); {
####
my $switch = sub { eval{ goto "case_$_[0]" } or goto default; };
for my $expr ( 1 .. 10, 'fred' ) {
$switch->( $expr ); {
####
use strict;
use Benchmark;
timethese( 50000,{
switch => sub {
sub switch{ eval{ goto "case_$_[0]" } or goto default; }
for my $expr ( 1 .. 10, 'fred' ) {
switch( $expr ); {
case_1: print STDERR '1'; last;
case_2: print STDERR '2'; last;
case_3: print STDERR '3'; last;
case_4: print STDERR '4'; last;
case_5: ;
case_6: print STDERR '5 or 6'; last;
case_fred: print STDERR 'fred'; last;
default: print STDERR "default";
}
}
},
if => sub {
for my $expr ( 1 .. 10, 'fred' ) {
if ($expr eq '1') {print STDERR '1'}
elsif ($expr eq '2') {print STDERR '2'}
elsif ($expr eq '3') {print STDERR '3'}
elsif ($expr eq '4') {print STDERR '4'}
elsif ($expr eq '5' or $expr eq '6') {print STDERR '5 or 6'}
elsif ($expr eq 'fred') {print STDERR 'fred'}
else {print STDERR "default"}
}
},
} );
####
Benchmark:
timing 50000 iterations of
if, switch
if: 7 wallclock secs ( 5.41 usr + 0.00 sys = 5.41 CPU) @ 9242.14/s (n=50000)
switch: 43 wallclock secs (39.85 usr + 0.00 sys = 39.85 CPU) @ 1254.71/s (n=50000)