我正在浏览GitHub上一个流行的存储库中的一些Perl代码,并运行此方法来计算哈希的大小:
Run Code Online (Sandbox Code Playgroud)while ( my ($a, undef ) = each %h ) { $num++; }
我想为什么会在编写所有代码时遇到麻烦,因为它可以更简单地写成
$num = scalar keys %h;
Run Code Online (Sandbox Code Playgroud)
所以,我将这两种方法与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++;
}
},
});
Run Code Online (Sandbox Code Playgroud)
RESULTS
Rate whileloop keys
whileloop 5090/s -- -100%
keys 7234884/s 142047% --
结果表明,使用keys比while循环快得多.我的问题是:为什么原始编码器会使用如此慢的方法?有什么东西我不见了吗?还有,有更快的方法吗?
我无法读懂任何人可能写过这段代码的想法,但他/她可能会想:
my $n = keys %hash;
Run Code Online (Sandbox Code Playgroud)
使用更多的内存比使用迭代所有内容each.
请注意,赋值左侧的标量会创建标量上下文:scalar除非您希望在列表上下文中创建标量上下文,否则不需要.