我在GitHub上的热门存储库中浏览了一些Perl代码,然后运行此方法来计算哈希的大小:
while ( my ($a, undef ) = each %h ) { $num++; }
我想为什么在编写所有代码时会遇到麻烦,因为它可以更简单地写成
$num = scalar keys %h;
所以,我将这两种方法与Benchmark进行了比较。
my %h = (1 .. 1000);
cmpthese(-10, {
keys => sub {
my $num = 0;
$num = scalar keys %h;
},
whileloop => sub {
my $num = 0;
while ( my ($a, undef ) = each %h ) {
$num++;
}
},
});
RESULTS Rate whileloop keys whileloop 5090/s -- -100% keys 7234884/s 142047% --
结果显示使用keys
比while循环快得多。我的问题是:为什么原始编码器会使用如此慢的方法?有什么东西我不见了吗?还有,有更快的方法吗?
答案 0 :(得分:5)
我无法读懂任何人可能写过这段代码的想法,但他/她可能会想:
my $n = keys %hash;
使用更多内存而不是使用each
迭代所有内容。
请注意,赋值左侧的标量会创建标量上下文:除非您希望在列表上下文中创建标量上下文,否则不需要scalar
。
答案 1 :(得分:4)
因为他不知道keys
能否返回哈希中的元素数量。