#!/usr/bin/perl # elsifbench - which is faster, a chain of elsif or a dispatch table? # SSF 112208 042609 use strict; use Benchmark qw/:all/; sub random { int rand shift } my @letters=('A'..'Z','a'..'z','0'..'9'); my $nLetters=scalar @letters; sub elsifchain { my $x=$letters[random($nLetters)]; if ($x eq 'A') { 'A' } elsif ($x eq 'B') { 'A' } elsif ($x eq 'C') { 'A' } elsif ($x eq 'D') { 'A' } elsif ($x eq 'E') { 'A' } elsif ($x eq 'F') { 'A' } elsif ($x eq 'G') { 'A' } elsif ($x eq 'H') { 'A' } elsif ($x eq 'I') { 'A' } elsif ($x eq 'J') { 'A' } elsif ($x eq 'K') { 'A' } elsif ($x eq 'L') { 'A' } elsif ($x eq 'M') { 'A' } elsif ($x eq 'N') { 'A' } elsif ($x eq 'O') { 'A' } elsif ($x eq 'P') { 'A' } elsif ($x eq 'Q') { 'A' } elsif ($x eq 'R') { 'A' } elsif ($x eq 'S') { 'A' } elsif ($x eq 'T') { 'A'; } elsif ($x eq 'U') { 'A'; } elsif ($x eq 'V') { 'A'; } elsif ($x eq 'W') { 'A'; } elsif ($x eq 'X') { 'A'; } elsif ($x eq 'Y') { 'A'; } elsif ($x eq 'Z') { 'A'; } elsif ($x eq 'a') { 'A'; } elsif ($x eq 'b') { 'A'; } elsif ($x eq 'c') { 'A'; } elsif ($x eq 'd') { 'A'; } elsif ($x eq 'e') { 'A'; } elsif ($x eq 'f') { 'A'; } elsif ($x eq 'g') { 'A'; } elsif ($x eq 'h') { 'A'; } elsif ($x eq 'i') { 'A'; } elsif ($x eq 'j') { 'A'; } elsif ($x eq 'k') { 'A'; } elsif ($x eq 'l') { 'A'; } elsif ($x eq 'm') { 'A'; } elsif ($x eq 'n') { 'A'; } elsif ($x eq 'o') { 'A'; } elsif ($x eq 'p') { 'A'; } elsif ($x eq 'q') { 'A'; } elsif ($x eq 'r') { 'A'; } elsif ($x eq 's') { 'A'; } elsif ($x eq 't') { 'A'; } elsif ($x eq 'u') { 'A'; } elsif ($x eq 'v') { 'A'; } elsif ($x eq 'w') { 'A'; } elsif ($x eq 'x') { 'A'; } elsif ($x eq 'y') { 'A'; } elsif ($x eq 'z') { 'A'; } elsif ($x eq '0') { 'A'; } elsif ($x eq '1') { 'A'; } elsif ($x eq '2') { 'A'; } elsif ($x eq '3') { 'A'; } elsif ($x eq '4') { 'A'; } elsif ($x eq '5') { 'A'; } elsif ($x eq '6') { 'A'; } elsif ($x eq '7') { 'A'; } elsif ($x eq '8') { 'A'; } elsif ($x eq '9') { 'A'; } else { warn "Huh?"; } } my %dispatch; for ('a'..'z', 'A'..'Z', 0..9) { $dispatch{$_} = sub { 'A' }; } sub dispatch { my $x=$letters[random($nLetters)]; if (exists $dispatch{$x}) { $dispatch{$x}->(); } else { warn "Huh?"; } } cmpthese(-1,{elsif=>\&elsifchain,dispatch=>\&dispatch}); exit;