我执行的类似测试的基准给出了每个 deref 大约 10 纳秒的结果。您发布的代码中只有 deref,所以我们说的是 0.000,000,010 秒的差异。
呸,差别太小了,我什至无法确定哪个更快!
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.04 usr + 0.02 sys = 3.06 CPU) @ 11.12/s (n=34)
array_ref: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 11.48/s (n=36)
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.06 usr + 0.03 sys = 3.09 CPU) @ 11.33/s (n=35)
array_ref: 3 wallclock secs ( 3.12 usr + 0.05 sys = 3.17 CPU) @ 11.37/s (n=36)
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 11.45/s (n=35)
array_ref: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 11.31/s (n=36)
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 11.66/s (n=36)
array_ref: 3 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 11.37/s (n=36)
array 在 50% 的时间里更快,array ref 在 50% 的时间里更快。
use strict;
use warnings;
use Benchmark qw( timethese );
my %tests = (
array_ref => 'my $x = join("", @$foo);',
array => 'my $x = join("", @foo);',
);
$_ = 'use strict; use warnings; our $foo; our @foo; ' . $_
for values(%tests);
our @foo = 1..1_500_000;
our $foo = \@foo;
timethese(-3, \%tests);
这是一个比您发布的测试更好的测试。您发布的唯一一个花费不到 1% 的时间做您想要测试的事情。
但同样,差异是如此之小,以至于无法衡量。有时数组 ref 出现得更快,有时数组出现得更快。
Actual speed is actually 1000x larger than indicated.
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 1015.54/s (n=3136)
array_ref: 3 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 1040.99/s (n=3378)
Actual speed is actually 1000x larger than indicated.
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.25 usr + 0.00 sys = 3.25 CPU) @ 1011.09/s (n=3281)
array_ref: 3 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 1022.13/s (n=3141)
Actual speed is actually 1000x larger than indicated.
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.29 usr + 0.00 sys = 3.29 CPU) @ 1020.96/s (n=3361)
array_ref: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 1016.26/s (n=3250)
Actual speed is actually 1000x larger than indicated.
Benchmark: running array, array_ref for at least 3 CPU seconds...
array: 3 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 1053.03/s (n=3237)
array_ref: 4 wallclock secs ( 3.23 usr + 0.00 sys = 3.23 CPU) @ 1006.50/s (n=3250)
同样,array 在 50% 的时间里更快,array ref 在 50% 的时间里更快。
use strict;
use warnings;
use Benchmark qw( timethese );
my %tests = (
array_ref => 'my $x = join("", @$foo);',
array => 'my $x = join("", @foo);',
);
$_ = 'use strict; use warnings; our $foo; our @foo; for (1..1000) { '.$_.' }'
for values(%tests);
our @foo = 1..15;
our $foo = \@foo;
print("Actual speed is actually 1000x larger than indicated.\n");
timethese(-3, \%tests);