【发布时间】:2014-01-28 11:29:15
【问题描述】:
我想知道基于 Internet 上的许多书籍,如果 $_ 真的是迭代数组的更快方法(不实例化新变量),但不知何故我总是得到不同的结果。下面是性能代码测试:
#!/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% 的情况下使用 $_ 进行迭代更快。
在没有新变量的情况下迭代不应该更快吗?
【问题讨论】:
-
sa $_ je onda brze ili sporije?
-
它实际上并没有将值复制到变量中。对此进行测试: perl -e '@a = (1, 2, 3); $_++ foreach (@a);打印@a;'你会看到它更新了@a。它实际上将列表中的变量别名为您定义的名称。这可能会影响性能。
-
让我翻译一下@mpapec 问的内容:) “那么,$_ 是快还是慢?”我说,根据我的发现,$_ 更慢......我只是想知道那是怎么回事? :)
-
无论
$_或其他一些变量的用法如何,foreach 变量始终是别名。 -
它与
I get mostly that iterating with $_ was faster in about 20-30% cases不在同一行 :)
标签: performance perl foreach