gpt4 book ai didi

perl - 键与值性能

转载 作者:行者123 更新时间:2023-12-04 22:43:37 25 4
gpt4 key购买 nike

我想知道哈希值比键性能更好的理论背景,以及 perldoc 是否涵盖了这个主题。

use strict;
use warnings;
use Benchmark qw(:all);

my %hash = 1 .. 30_000;

cmpthese(-3, {
values => sub {
for my $v (values %hash) { }

},
keys => sub {
for my $v (keys %hash) { }
},
avalues => sub {
for my $v (@{[ values %hash ]}) { }
},
akeys => sub {
for my $v (@{[ keys %hash ]}) { }
},
});

__DATA__
Rate akeys keys avalues values
akeys 196/s -- -33% -56% -71%
keys 294/s 50% -- -35% -57%
avalues 451/s 130% 54% -- -33%
values 677/s 245% 131% 50% --

perl 是 5.20.0

最佳答案

键不作为标量存储在哈希中。因此,必须为 keys 返回的每个键创建一个字符串标量。

另一方面,值作为标量存储在散列中,这些标量由 values 返回。除了一个指针,什么都不复制。

可以使用以下基准来证明上述内容:

use strict;
use warnings;

use Benchmark qw( cmpthese );

my %sm_hash = map { sprintf('%04d', $_) } 1 .. 1000*2;
my %lg_hash = map { ( "x" x 10_000 ) . sprintf('%04d', $_) } 1 .. 1000*2;

cmpthese(-3, {
sm_values => sub { 1 for values %sm_hash },
lg_values => sub { 1 for values %lg_hash },
sm_keys => sub { 1 for keys %sm_hash },
lg_keys => sub { 1 for keys %lg_hash },
});

输出:
             Rate   lg_keys   sm_keys lg_values sm_values
lg_keys 5286/s -- -19% -57% -58%
sm_keys 6532/s ==> 24% -- -47% -48%
lg_values 12247/s 132% 87% -- -2%
sm_values 12517/s 137% 92% ==> 2% --

如您所见,键的长度会影响评估 keys 所需的时间,但值的长度对评估 values 所需的时间没有影响。

一个更简单但不太明确的演示以尝试修改 keysvalues 返回的值的形式出现。
for (keys(%h)) {
$_ = uc($_); # Has no effect on the hash.
}

for (values(%h)) {
$_ = uc($_); # Effects the hash.
}

关于perl - 键与值性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358958/

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