我想知道散列值比键更好的理论背景,以及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
答案 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}所需的时间没有影响被评估。
更简单但不太明确的演示是试图修改values
和keys
返回的值。
values