少なくとも私のシステムでは、Perlのバージョンとアーキテクチャに依存しているようです。
#!/usr/bin/perl -w
use strict;
use warnings;
use autodie;
use Benchmark qw( cmpthese );
print "Using Perl $] under $^O\n\n";
cmpthese(
-1,
{
shifted => 'call( \&shifted )',
list_copy => 'call( \&list_copy )',
}
);
sub call {
$_[0]->(1..6); # Call our sub with six dummy args.
}
sub shifted {
my $foo = shift;
my $bar = shift;
my $baz = shift;
my $qux = shift;
my $quux = shift;
my $corge = shift;
return;
}
sub list_copy {
my ($foo, $bar, $baz, $qux, $quux, $corge) = @_;
return;
}
結果:
Using Perl 5.008008 under cygwin
Rate shifted list_copy
shifted 492062/s -- -10%
list_copy 547589/s 11% --
Using Perl 5.010000 under MSWin32
Rate list_copy shifted
list_copy 416767/s -- -5%
shifted 436906/s 5% --
Using Perl 5.008008 under MSWin32
Rate shifted list_copy
shifted 456435/s -- -19%
list_copy 563106/s 23% --
Using Perl 5.008008 under linux
Rate shifted list_copy
shifted 330830/s -- -17%
list_copy 398222/s 20% --
したがって、実際にはシフトがわずかに速いPerl 5.10を除いて、list_copyはシフトよりも通常20%高速であるように見えます。
これらはすぐに導き出された結果であることに注意してください。ベンチマークは、サブルーチンの呼び出しと戻りにかかる時間もカウントするため、実際の速度の差はここにリストされているものよりも大きくなります。これは、結果に適度な影響を及ぼします。Perlが特別な種類の最適化を行っているかどうかを確認するための調査は行っていません。あなたのマイレージは異なる場合があります。
ポール