关于子函数参数传递的效率问题

use strict;
use warnings;

use Benchmark qw(cmpthese);

use MooseX::Declare;
use Method::Signatures::Modifiers;

sub array_ref {
    my $args = \@_;
    return $args->[0];
}

sub array_copy {
    my ($first, $second, $third) = @_;
    return $first;
}

sub shift_off {
    my $first  = shift;
    my $second = shift;
    my $third  = shift;
    return $first;
}

sub copy_once {
    my @args = @_;
    return $args[0];
}

sub copy_twice {
    my @args   = @_;
    my $first  = $args[0];
    my $second = $args[1];
    my $third  = $args[2];
    return $args[0];
}

sub named {
    my %args = @_;
    return $args{first};
}

sub named_copy {
    my %args   = @_;
    my $first  = $args{first};
    my $second = $args{second};
    my $third  = $args{third};
    return $first;
}

class Bench::Moose {
    method moose(Int $first, Str $second, Any $third) {
        return $first;
    }
}

my @sample_args = (1, "foo bar baz", {a => 1, b => 2, c => [{i => 1, ii => 2, iii => 3}, 4, 5, 6]});
my $moose_obj = Bench::Moose->new;

cmpthese(
    0,
    {
        array_ref  => sub {array_ref(@sample_args);},
        array_copy => sub {array_copy(@sample_args);},
        shift_off  => sub {shift_off(@sample_args);},
        copy_once  => sub {copy_once(@sample_args);},
        copy_twice => sub {copy_twice(@sample_args);},
        named      => sub {named(first => $sample_args[0], second => $sample_args[1], third => $sample_args[2])},
        named_copy => sub {named_copy(first => $sample_args[0], second => $sample_args[1], third => $sample_args[2])},
        moose      => sub {$moose_obj->moose(@sample_args);},
    }
);

吼吼,自己试试看吧,看来我一直都是在用效率比较低的方式。

你可能感兴趣的:(参数传递,subroutine)