1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
perl -wE'for (1..20) { $hash{$_}++; say scalar %hash; }'
1/8
2/8
3/8
3/8
4/8
5/8
6/8
7/16
8/16
9/16
10/16
10/16
10/16
11/16
11/16
14/32
14/32
15/32
15/32
15/32
QuoteIf you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any
key/value pairs, it returns true; more precisely, the value returned is a string consisting of the
number of used buckets and the number of allocated buckets, separated by a slash.
2012-08-16T21:14:43 Muffiwenn man weiss welche Zahlen man am besten setzt.
2012-08-16T21:14:43 MuffiZusammenfassend kann man wohl sagen, dass man mit dem manuellen Setzen der Buckets ein bisschen Performance rausholen kann, wenn man weiss welche Zahlen man am besten setzt.
QuoteFür was man die Zahlen allerdings auslesen können muss ist mir bis heute noch nicht so ganz klar.
2012-08-16T23:58:33 RaubtierWenn die Anzahl der Keys == die Zahl vor den Slash, dann war das Hashing optimal.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Benchmark qw(:all);
my ($resultPre, $resultNormal);
timethese(-100, {
preAssign => sub {
my %h;
keys %h = 1e8;
$h{$_} = $_ for 1..1e8;
$resultPre = scalar %h unless $resultPre;
},
normal => sub {
my %h;
$h{$_} = $_ for 1..1e8;
$resultNormal = scalar %h unless $resultNormal;
},
});
print "Pre: $resultPre\n";
print "Normal: $resultNormal\n";
1
2
3
4
5
6
7
Benchmark: running normal, preAssign for at least 100 CPU seconds...
normal: 210 wallclock secs (209.64 usr + 0.01 sys = 209.65 CPU) @ 0.00/s (n=1)
(warning: too few iterations for a reliable count)
preAssign: 276 wallclock secs (275.12 usr + 0.32 sys = 275.44 CPU) @ 0.00/s (n=1)
(warning: too few iterations for a reliable count)
Pre: 70452330/134217728
Normal: 70452330/134217728
1
2
3
4
5
Benchmark: running normal, preAssign for at least 100 CPU seconds...
normal: 106 wallclock secs (104.92 usr + 0.01 sys = 104.93 CPU) @ 67924.06/s (n=7127272)
preAssign: 104 wallclock secs (105.09 usr + 0.01 sys = 105.10 CPU) @ 50860.65/s (n=5345454)
Pre: 33/64
Normal: 33/64
Quoteda muss nichts swappen - und wenn, dann müsste er ja auch schon vorher geswappt haben, vermute ich