gpt4 book ai didi

performance - 为什么使用 $_ 进行迭代需要更长的时间

转载 作者:行者123 更新时间:2023-12-02 21:52:45 26 4
gpt4 key购买 nike

我想知道基于互联网上的许多书籍, $_ 是否真的是迭代数组的更快方法(没有实例化新变量),但不知何故我总是得到不同的结果。下面是性能代码测试:

#!/usr/bin/perl
use Time::HiRes qw(time);

use strict;
use warnings;

# $_ is a default argument for many operators, and also for some control structures.

my $test_array = [1..1000000];

my $number_of_tests = 100;
my $dollar_wins = 0;
my $dollar_wins_sum = 0;

for (my $i = 1; $i <= $number_of_tests; $i++) {
my $odd_void_array = [];
my $start_time_1 = time();
foreach my $item (@{$test_array}) {
if ($item % 2 == 1) {
push (@{$odd_void_array}, $item);
}
}
foreach my $item_odd (@{$odd_void_array}) {
}
my $end_time_1 = time();

$odd_void_array = [];
my $start_time_2 = time();
foreach (@{$test_array}) {
if ($_ % 2 == 1) {
push (@{$odd_void_array}, $_);
}
}
foreach (@{$odd_void_array}) {
}
my $end_time_2 = time();

my $diff = ($end_time_1-$start_time_1) - ($end_time_2-$start_time_2);
if ($diff > 0) {
$dollar_wins ++;
$dollar_wins_sum += $diff;
print "Dollar won ($dollar_wins out of $i) with diff $diff \n";
}
}

print "=================================\n";
print "When using dollar underscore, execution was faster in $dollar_wins cases (".(($dollar_wins/$number_of_tests)*100)."%), with average difference of ".($dollar_wins_sum/$dollar_wins)."\n";

所以,我有两次迭代(一次分配给我的 $item,另一次不分配)。我主要了解到,在大约 20-30% 的情况下,使用 $_ 进行迭代速度更快。

没有新变量的迭代不应该更快吗?

最佳答案

您并没有真正使用不同的变量对迭代进行基准测试。

  • 您的时间包括数组创建和其他计算。
  • 您只能判断哪个更快,而不是快多少。
  • 您的迭代次数太少,无法得出任何可靠的信息。

让我们进行这个更好的测试,实际对您声称的基准进行基准测试:

use strict;
use warnings;
use Benchmark ':hireswallclock', 'cmpthese';

my @numbers = 1..100_000;

cmpthese -3, {
'$_' => sub {
for (@numbers) {
1;
}
},
'my $x' => sub {
for my $x (@numbers) {
1;
}
},
'$x' => sub {
my $x;
for $x (@numbers) {
1;
}
},
}

结果:

       Rate    $_ my $x    $x
$_ 107/s -- -0% -0%
my $x 107/s 0% -- -0%
$x 108/s 0% 0% --

所以它们在我的测试系统(为 i686-linux-thread-multi-64int 构建的 perl 5.18.2)上同样快。

我怀疑使用 $_ 比词法稍慢,因为它是一个全局变量。然而,迭代速度是等效的。事实上,修改基准......

use strict;
use warnings;
use Benchmark ':hireswallclock', 'cmpthese';

my @numbers = 1..100_000;

cmpthese -3, {
'$_' => sub {
for (@numbers) {
$_ % 2 == 0;
}
},
'my $x' => sub {
for my $x (@numbers) {
$x % 2 == 0;
}
},
'$x' => sub {
my $x;
for $x (@numbers) {
$x % 2 == 0;
}
},
}

...给出

        Rate    $_    $x my $x
$_ 40.3/s -- -1% -6%
$x 40.6/s 1% -- -5%
my $x 42.9/s 7% 6% --

但影响仍然太小,无法得出任何可靠的结论。

关于performance - 为什么使用 $_ 进行迭代需要更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21404420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com