加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读