#!perl -w use strict; use Benchmark qw/cmpthese/; use Test::More tests => 1; { package Bench::Base; sub foo { 1 }; } my $c; my $sub_iter = 100; cmpthese (-1 => { recompute_existing_ISA => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}"; no strict 'refs'; @{ "$class\::ISA"} = (@{ "$class\::ISA"},'Bench::Base'); die unless $class->foo; } }, recompute_new_ISA => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}::SubSub${_}"; no strict 'refs'; @{ "$class\::ISA"} = (@{ "$class\::ISA"},'Bench::Base'); die unless $class->foo; } }, push_existing_ISA => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}"; no strict 'refs'; push @{ "$class\::ISA"}, 'Bench::Base'; die unless $class->foo; } }, push_new_ISA => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}::SubSub${_}"; no strict 'refs'; push @{ "$class\::ISA"}, 'Bench::Base'; die unless $class->foo; } }, push_new_FOO => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}::SubSub${_}"; no strict 'refs'; push @{ "$class\::FOO"}, 'Bench::Base'; #die unless $class->foo; } }, push_existing_FOO => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}"; no strict 'refs'; push @{ "$class\::FOO"}, 'Bench::Base'; #die unless $class->foo; } }, recompute_existing_FOO => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}"; no strict 'refs'; @{ "$class\::FOO"} = (@{ "$class\::FOO"}, 'Bench::Base'); #die unless $class->foo; } }, # Take a reference and manipulate that, in case string references are slow refcompute_existing_FOO => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}"; no strict 'refs'; my $aref = \@{ "$class\::FOO"}; @{ $aref } = (@{ $aref }, 'Bench::Base'); #die unless $class->foo; } }, recompute_new_FOO => sub { $c++; for (1..$sub_iter) { my $class = "Bench::Par::Sub_${c}::SubSub${_}"; no strict 'refs'; @{ "$class\::FOO"} = (@{ "$class\::FOO"}, 'Bench::Base'); #die unless $class->foo; } }, }); pass "Benchmarks run";