perl – 键vs值性能
发布时间:2020-12-15 23:24:32 所属栏目:大数据 来源:网络整理
导读:我想知道散列值比键更好的理论背景,以及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) { } },ava
我想知道散列值比键更好的理论背景,以及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 解决方法
密钥不作为标量存储在哈希中.因此,必须为键返回的每个键创建一个字符串标量.
另一方面,值在散列中存储为标量,并且这些标量由值返回.什么都没有复制,只有指针. 使用以下基准可以证明以上内容: 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% -- 如您所见,键的长度会影响键的计算时间,但值的长度不会影响值的计算时间. 更简单但不太明确的演示以尝试修改键和值返回的值的形式出现. for (keys(%h)) { $_ = uc($_); # Has no effect on the hash. } for (values(%h)) { $_ = uc($_); # Effects the hash. } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |