use strict; use warnings; use Benchmark qw/cmpthese/; my @translation = qw / Zero One Two Three/; my %trans = (1 => "One", 2 => "Two", 3 => "Three"); my @dispatch = ( sub {return "Zero"}, sub {return "One"}, sub {return "Two"}, sub {return "Three"} ); sub test1 { my \$var2 = shift; return ("One") if (\$var2 =~ /^1/ ); return ("Two") if (\$var2 =~ /^2/ ); return ("Three") if (\$var2 =~ /^3/ ); return undef; } sub test2 { my \$var2 = substr shift, 0, 1; return ("One") if (\$var2 == 1 ); return ("Two") if (\$var2 == 2 ); return ("Three") if (\$var2 == 3 ); return undef; } sub test3 { return \$translation[(substr shift, 0, 1)]; } sub test4 { my \$var = shift; return \$trans{\$1} if \$var =~ /^(\d)\./ ; } sub test5 { my \$var = substr shift, 0, 1; eval { goto "_\$var" } or return "Other"; _1: return "One" ; _2: return "Two" ; _3: return "Three"; } sub test6 { return \$dispatch[(substr shift, 0, 1)]->(); } cmpthese( -1, { _linear_1 => q {test1("2.01.000")}, _linear_2 => q {test2("2.01.000")}, _array => q {test3("2.01.000")}, _hash_regex => q {test4("2.01.000")}, _goto => q {test5("2.01.000")}, _dispatch => q {test6("2.01.000")}, } ) ##```## \$ perl test_if.pl Rate _hash_regex _goto linear_1 linear_2 _dispatch _array _hash_regex 831494/s -- -29% -46% -52% -54% -70% _goto 1173439/s 41% -- -24% -32% -36% -57% _linear_1 1538868/s 85% 31% -- -10% -16% -44% _linear_2 1714704/s 106% 46% 11% -- -6% -37% _dispatch 1827212/s 120% 56% 19% 7% -- -33% _array 2735932/s 229% 133% 78% 60% 50% -- ```