Thread Hash im Skalaren Kontext 3/8 und so (15 answers)
Opened by rosti at 2012-08-16 18:32

Raubtier
 2012-08-17 11:51
#161108 #161108
User since
2012-05-04
1057 Artikel
BenutzerIn

user image
Ich sollte nicht behaupten, etwas sei schneller ohne einen Benchmark gemacht zu haben! Erstaunlicherweise ist nämlich die Version ohne direkte Zuweisung an %keys schneller!

Code: (dl )
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";


Ergebnis für 100 mio Keys ist:
Code: (dl )
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



Gut, nur ein Durchlauf. Aber trotzdem ein deutlicher Unterschied. Oder habe ich da irgendwas falsch gemacht?

Oder muss man vielleicht noch bedenken, dass ein kleinerer Hash komplett im Prozessor-Cache gehalten werden kann und es daher schneller sein kann, diesen mehrmals in der Größe zu ändern?


Wenn ich nur 40 statt 1e8 Keys nehme:
Code: (dl )
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


Conclusion: es bringt nichts, daran rumzudoktoren. Das ist in Perl bereits wunderbar optimiert, sodass man selbst sich nicht mehr darum kümmern muss.

(Tests mit 5.8.8 gemacht)

modedit Editiert von pq: code-tags um benchmark-ausgabe, sonst unlesbar
Last edited: 2012-08-17 12:32:20 +0200 (CEST)

View full thread Hash im Skalaren Kontext 3/8 und so