1#!perl -w 2use strict; 3use Benchmark qw/cmpthese/; 4use Test::More tests => 1; 5 6{ 7 package Bench::Base; 8 sub foo { 1 }; 9} 10 11my $c; 12my $sub_iter = 100; 13 14cmpthese (-1 => { 15 recompute_existing_ISA => sub { 16 $c++; 17 for (1..$sub_iter) { 18 my $class = "Bench::Par::Sub_${c}"; 19 no strict 'refs'; 20 @{ "$class\::ISA"} = (@{ "$class\::ISA"},'Bench::Base'); 21 die unless $class->foo; 22 } 23 }, 24 recompute_new_ISA => sub { 25 $c++; 26 for (1..$sub_iter) { 27 my $class = "Bench::Par::Sub_${c}::SubSub${_}"; 28 no strict 'refs'; 29 @{ "$class\::ISA"} = (@{ "$class\::ISA"},'Bench::Base'); 30 die unless $class->foo; 31 } 32 }, 33 push_existing_ISA => sub { 34 $c++; 35 for (1..$sub_iter) { 36 my $class = "Bench::Par::Sub_${c}"; 37 no strict 'refs'; 38 push @{ "$class\::ISA"}, 'Bench::Base'; 39 die unless $class->foo; 40 } 41 }, 42 push_new_ISA => sub { 43 $c++; 44 for (1..$sub_iter) { 45 my $class = "Bench::Par::Sub_${c}::SubSub${_}"; 46 no strict 'refs'; 47 push @{ "$class\::ISA"}, 'Bench::Base'; 48 die unless $class->foo; 49 } 50 }, 51 push_new_FOO => sub { 52 $c++; 53 for (1..$sub_iter) { 54 my $class = "Bench::Par::Sub_${c}::SubSub${_}"; 55 no strict 'refs'; 56 push @{ "$class\::FOO"}, 'Bench::Base'; 57 #die unless $class->foo; 58 } 59 }, 60 push_existing_FOO => sub { 61 $c++; 62 for (1..$sub_iter) { 63 my $class = "Bench::Par::Sub_${c}"; 64 no strict 'refs'; 65 push @{ "$class\::FOO"}, 'Bench::Base'; 66 #die unless $class->foo; 67 } 68 }, 69 recompute_existing_FOO => sub { 70 $c++; 71 for (1..$sub_iter) { 72 my $class = "Bench::Par::Sub_${c}"; 73 no strict 'refs'; 74 @{ "$class\::FOO"} = (@{ "$class\::FOO"}, 'Bench::Base'); 75 #die unless $class->foo; 76 } 77 }, 78 79 # Take a reference and manipulate that, in case string references are slow 80 refcompute_existing_FOO => sub { 81 $c++; 82 for (1..$sub_iter) { 83 my $class = "Bench::Par::Sub_${c}"; 84 no strict 'refs'; 85 my $aref = \@{ "$class\::FOO"}; 86 @{ $aref } = (@{ $aref }, 'Bench::Base'); 87 #die unless $class->foo; 88 } 89 }, 90 recompute_new_FOO => sub { 91 $c++; 92 for (1..$sub_iter) { 93 my $class = "Bench::Par::Sub_${c}::SubSub${_}"; 94 no strict 'refs'; 95 @{ "$class\::FOO"} = (@{ "$class\::FOO"}, 'Bench::Base'); 96 #die unless $class->foo; 97 } 98 }, 99}); 100 101pass "Benchmarks run"; 102