Rate copied proto caller direct called NAMED copied 105/s -- -52% -62% -62% -62% -62% proto 219/s 109% -- -20% -21% -21% -21% caller 274/s 162% 25% -- -1% -1% -2% direct 277/s 164% 26% 1% -- -0% -1% called 277/s 164% 26% 1% 0% -- -1% NAMED 279/s 166% 27% 2% 1% 1% -- #### Rate copied called caller proto NAMED direct copied 15741/s -- -54% -57% -66% -74% -74% called 34560/s 120% -- -5% -25% -43% -44% caller 36557/s 132% 6% -- -21% -39% -41% proto 46058/s 193% 33% 26% -- -24% -25% NAMED 60268/s 283% 74% 65% 31% -- -2% direct 61563/s 291% 78% 68% 34% 2% -- #### use constant { STRING=>0, NUMS=>1, }; sub foo{ $_[STRING] =~ tr[...][...] if $_[NUMS] == '123'; } #### #! perl -slw use strict; use vars qw[ $VALIDATE ]; use Benchmark qw[ cmpthese ]; sub copied_args { my( $a1, $a2 ) = @_; $a1 =~ tr[A-Za-z][N-ZA-Mn-za-m]; $a2 =~ tr[0-9][9876543210]; return $a1, $a2; } sub proto_refs ($$) { my( $a1, $a2 ) = @_; $a1 =~ tr[A-Za-z][N-ZA-Mn-za-m]; $a2 =~ tr[0-9][9876543210]; return; } sub caller_refs { my( $a1, $a2 ) = @_; $$a1 =~ tr[A-Za-z][N-ZA-Mn-za-m]; $$a2 =~ tr[0-9][9876543210]; return; } sub called_refs { my( $a1, $a2 ) = \( @_ ); $$a1 =~ tr[A-Za-z][N-ZA-Mn-za-m]; $$a2 =~ tr[0-9][9876543210]; return; } sub direct_args { $_[0] =~ tr[A-Za-z][N-ZA-Mn-za-m]; $_[1] =~ tr[0-9][9876543210]; return; } use constant { STRING=>0, NUMS=>1 }; sub NAMED_args { $_[STRING] =~ tr[A-Za-z][N-ZA-Mn-za-m]; $_[NUMS] =~ tr[0-9][9876543210]; return; } our $small_text = 'The Quick Brown Fox Jumps Over The Lazy Dog'; our $large_text = $small_text x 1000; our $small_nums = '0123456789'; our $large_nums = $small_nums x 1000; if( $VALIDATE ) { ( $small_text, $small_nums ) = copied_args $small_text, $small_nums; print $small_text, ' : ', $small_nums; ( $small_text, $small_nums ) = copied_args $small_text, $small_nums; print $small_text, ' : ', $small_nums; caller_refs \$small_text, \$small_nums; print $small_text, ' : ', $small_nums; caller_refs \$small_text, \$small_nums; print $small_text, ' : ', $small_nums; called_refs $small_text, $small_nums; print $small_text, ' : ', $small_nums; called_refs $small_text, $small_nums; print $small_text, ' : ', $small_nums; proto_refs $small_text, $small_nums; print $small_text, ' : ', $small_nums; proto_refs $small_text, $small_nums; print $small_text, ' : ', $small_nums; direct_args $small_text, $small_nums; print $small_text, ' : ', $small_nums; direct_args $small_text, $small_nums; print $small_text, ' : ', $small_nums; NAMED_args $small_text, $small_nums; print $small_text, ' : ', $small_nums; NAMED_args $small_text, $small_nums; print $small_text, ' : ', $small_nums; } else { cmpthese( -3, { 'copied_small' => q[ ( $small_text, $small_nums ) = copied_args $small_text, $small_nums; ], 'caller_small' => q[ caller_refs \$small_text, \$small_nums; ], 'called_small' => q[ called_refs $small_text, $small_nums; ], ' proto_small' => q[ proto_refs $small_text, $small_nums; ], 'direct_small' => q[ direct_args $small_text, $small_nums; ], ' NAMED_small' => q[ NAMED_args $small_text, $small_nums; ], }); cmpthese( -3, { 'copied_large' => q[ ( $large_text, $large_nums ) = copied_args $large_text, $large_nums; ], 'caller_large' => q[ caller_refs \$large_text, \$large_nums; ], 'called_large' => q[ called_refs $large_text, $large_nums; ], ' proto_large' => q[ proto_refs $large_text, $large_nums; ], 'direct_large' => q[ direct_args $large_text, $large_nums; ], ' NAMED_large' => q[ NAMED_args $large_text, $large_nums; ], }); }