键与值的表现

时间:2016-05-21 04:40:47

标签: perl hash

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

    $(document).ready(function () {
        var mg = new Date(2016, 5, 21, 0, 0, 0, 0);
        var tmr = window.setInterval(function () {
            var d = new Date();
            var dif = mg - d;
            var s = parseInt(dif / 1000);
if (s < 0) {
    document.getElementById('spCnt').innerHTML = 'Event starts';
    window.clearInterval(tmr);
    return;
}
            var sec = s % 60;
            var m = parseInt(s / 60);
            var min = m % 60;
            var h = parseInt(m / 60);
            var hour = h % 24;
            d = parseInt(h / 24);

            document.getElementById('spCnt').innerHTML = d + ' days ' + hour + ' hours ' + min + ' min and ' + sec + ' sec remaining';
        }, 1000);
    });

perl是5.20.0

1 个答案:

答案 0 :(得分:10)

密钥不作为标量存储在哈希中。因此,必须为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的评估时间,但值的长度对{{1}所需的时间没有影响被评估。

更简单但不太明确的演示是试图修改valueskeys返回的值。

values