use strict; use warnings; use Benchmark qw( cmpthese ); use Data::Dumper qw( Dumper ); use List::Util qw( max ); use constant REPS => $ARGV[0]; use constant COUNT => $ARGV[1]; { my $test_if = q{ my $rv = ($var eq "A" || $var eq 'B' || $var eq 'C'); }; my $test_ihash = q{ my $rv = { A=>1, B=>1, C=>1 }->{$var}; }; local our %hash = ( A=>1, B=>1, C=>1 ); my $test_shash = q{ our %hash; my $rv = $hash{$var}; }; my $test_re = q{ my $rv = $var =~ /^(?:A|B|C)\z/; }; my %tests = ( if => $test_if, ihash => $test_ihash, shash => $test_shash, re => $test_re, ); my $tnl = max map length, keys %tests; foreach (values %tests) { $_ = q{ use strict; use warnings; our $var; } . $_; } { print("Compilation tests\n"); print("\n"); local our $var = 'moo'; my $exit; foreach my $test (sort keys %tests) { printf('%-*s ', $tnl+1, "$test:"); eval($tests{$test}); my $e = $@; if ($@) { chomp($e); print("Compile error: $e\n"); $exit = 1; } else { print("Compiles ok\n"); } } exit(1) if $exit; } print("\n"); print("\n"); { print("Benchmarking no matches\n"); print("\n"); local our $var = 'D'; my $exit; foreach my $test (sort keys %tests) { printf('%-*s ', $tnl+1, "$test:"); my $rv = eval($tests{$test} . ';$rv'); if ($rv) { local $Data::Dumper::Terse = 1; print("Runs error: ", Dumper($test)); $exit = 1; } else { print("Runs ok\n"); } } last if $exit; for (1..REPS) { print("\n"); cmpthese(COUNT, \%tests); } } for (qw( A B C )) { print("\n"); print("\n"); local our $var = $_; print("Benchmarking match $var\n"); print("\n"); my $exit; foreach my $test (sort keys %tests) { printf('%-*s ', $tnl+1, "$test:"); my $rv = eval($tests{$test} . ';$rv'); if ($rv) { print("Runs ok\n"); } else { local $Data::Dumper::Terse = 1; print("Runs error: ", Dumper($test)); $exit = 1; } } last if $exit; for (1..REPS) { print("\n"); cmpthese(COUNT, \%tests); } } }