for my $var ( undef, 1 .. 10, 'fred' ) { goto 'CASE' . do{ local $^W; $var + 0 }; CASE10: print "a"; CASE9: print "b"; CASE8: print "c"; CASE7: print "d"; CASE6: print "e"; CASE5: print "f"; CASE4: print "g"; CASE3: print "h"; CASE2: print "i"; CASE1: print "j"; print "\n"; CASE0: } #### P:\test>388915 ?> 1..10 Testing for vals [1..10] Rate if_cascade and_cascade goto_do goto_eval goto if_cascade 11395/s -- -2% -11% -26% -26% and_cascade 11627/s 2% -- -9% -24% -25% goto_do 12845/s 13% 10% -- -17% -17% goto_eval 15389/s 35% 32% 20% -- -0% goto 15423/s 35% 33% 20% 0% -- ?> #### #! perl -sw use strict; use Benchmark qw[ cmpthese ]; our $DEBUG ||=0; our $ITERS = $DEBUG ? 1 : -3; $DEBUG or open STDOUT, '> :raw', \my( $mem ) or die $!; my $tests = { goto_eval => q[ $DEBUG and print "\ngoto_eval\n"; for my $var ( @inputs ) { eval { goto "CASE$var" } or goto DEFAULT; CASE10: print "a"; CASE9: print "b"; CASE8: print "c"; CASE7: print "d"; CASE6: print "e"; CASE5: print "f"; CASE4: print "g"; CASE3: print "h"; CASE2: print "i"; CASE1: print "j"; print "\n"; DEFAULT: } ], goto_do => q[ $DEBUG and print "\ngoto_do\n"; for my $var ( @inputs ) { goto 'CASE' . do{ local $^W; $var + 0 }; CASE10: print "a"; CASE9: print "b"; CASE8: print "c"; CASE7: print "d"; CASE6: print "e"; CASE5: print "f"; CASE4: print "g"; CASE3: print "h"; CASE2: print "i"; CASE1: print "j"; print "\n"; CASE0: } ], goto => q[ $DEBUG and print "\ngoto\n"; for my $var ( @inputs ) { goto 'CASE' . ($var + 0); CASE10: print "a"; CASE9: print "b"; CASE8: print "c"; CASE7: print "d"; CASE6: print "e"; CASE5: print "f"; CASE4: print "g"; CASE3: print "h"; CASE2: print "i"; CASE1: print "j"; print "\n"; CASE0: } ], if_cascade => q[ $DEBUG and print "\nif_cascade\n"; for my $var ( @inputs ) { for my $val ( $var ) { print "a" if ( $val >= 10 ); print "b" if ( $val >= 9 ); print "c" if ( $val >= 8 ); print "d" if ( $val >= 7 ); print "e" if ( $val >= 6 ); print "f" if ( $val >= 5 ); print "g" if ( $val >= 4 ); print "h" if ( $val >= 3 ); print "i" if ( $val >= 2 ); print "j" if ( $val >= 1 ); } print "\n"; } ], and_cascade => q[ $DEBUG and print "\nand_cascade\n"; for my $var ( @inputs ) { for ( $var ) { $_ >= 10 and print "a"; $_ >= 9 and print "b"; $_ >= 8 and print "c"; $_ >= 7 and print "d"; $_ >= 6 and print "e"; $_ >= 5 and print "f"; $_ >= 4 and print "g"; $_ >= 3 and print "h"; $_ >= 2 and print "i"; $_ >= 1 and print "j"; } print "\n"; } ], }; print STDERR '?> '; while( ) { chomp; warn "Testing for vals [$_]\n"; our @inputs = eval; cmpthese $ITERS, $tests; print STDERR '?> '; } __END__ P:\test>388915 ?> 1..10 Testing for vals [1..10] Rate if_cascade and_cascade goto_do goto_eval goto if_cascade 11395/s -- -2% -11% -26% -26% and_cascade 11627/s 2% -- -9% -24% -25% goto_do 12845/s 13% 10% -- -17% -17% goto_eval 15389/s 35% 32% 20% -- -0% goto 15423/s 35% 33% 20% 0% -- ?> P:\test>388915 -DEBUG=1 ?> 1..10, 'fred', undef Testing for vals [1..10, 'fred', undef] and_cascade j ij hij ghij fghij efghij defghij cdefghij bcdefghij abcdefghij Argument "fred" isn't numeric in numeric ge (>=) at (eval 5) line 5, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 5, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 6, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 7, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 8, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 9, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 10, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 11, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 12, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 13, line 1. Use of uninitialized value in numeric ge (>=) at (eval 5) line 14, line 1. (warning: too few iterations for a reliable count) goto j ij hij ghij fghij efghij defghij cdefghij bcdefghij abcdefghij Use of uninitialized value in addition (+) at (eval 7) line 4, line 1. (warning: too few iterations for a reliable count) goto_do j ij hij ghij fghij efghij defghij cdefghij bcdefghij abcdefghij (warning: too few iterations for a reliable count) goto_eval j ij hij ghij fghij efghij defghij cdefghij bcdefghij abcdefghij Use of uninitialized value in concatenation (.) or string at (eval 11) line 4, line 1. (warning: too few iterations for a reliable count) if_cascade j ij hij ghij fghij efghij defghij cdefghij bcdefghij abcdefghij Use of uninitialized value in numeric ge (>=) at (eval 13) line 5, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 6, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 7, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 8, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 9, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 10, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 11, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 12, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 13, line 1. Use of uninitialized value in numeric ge (>=) at (eval 13) line 14, line 1. (warning: too few iterations for a reliable count) Rate goto_do and_cascade goto_eval goto if_cascade goto_do 1000000000000000/s -- 0% 0% 0% 0% and_cascade 1000000000000000/s 0% -- 0% 0% 0% goto_eval 1000000000000000/s 0% 0% -- 0% 0% goto 1000000000000000/s 0% 0% 0% -- 0% if_cascade 1000000000000000/s 0% 0% 0% 0% -- ?> ^Z