Thread Syntax Zugriff Array Index (23 answers)
Opened by bianca at 2019-08-11 08:23

haj
 2019-08-12 12:40
#190365 #190365
User since
2015-01-07
132 articles
BenutzerIn
[default_avatar]
2019-08-11T22:29:39 FIFO
... map() ohne Zuweisung kommt mir nicht so schnell in den Sinn, aber je nach Anwendungsfall ist der Performanceunterschied ja deutlich ...
map (und grep) in leerem Kontext gelten ja auch als etwas anrüchig, weil man sich "nur" der Nebeneffekte bedient. Und weil man's deswegen manchmal falsch macht. So wie ich hier: Einfach die Zuweisung wegzulassen funktioniert so nicht. Peinlich, peinlich.

Richtig wäre es beispielsweise so:
Code (perl): (dl )
1
2
3
sub void_array {
    map { $_->[0] eq 'a3333' and $_->[1]++ } @stats;
}


Ich habe nochmal eine korrigierte Version erstellt, die auch eine einzeilige Version von Biancas Original enthält. CPAN:Hash::Ordered habe ich nicht mit aufgenommen, weil dabei der Aufbau des Hashes zehnmal so lang braucht als der Schleifendurchlauf. Das lohnt sich erst bei mehr als einem Dutzend Zugriffe auf den Hash.

Hier die
komplette, korrigierte Version samt Ergebnis (9.2kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use strict;
use warnings;
use Benchmark ('timethese');

my $size = 10000;
my @stats = map { [ "a$_" => 0] } (0..$size);

sub rewrite_array {
    @stats = map { $_->[0] eq 'a3333' ? [$_->[0], $_->[1] + 1] : $_ } @stats;
}

sub loop {
    for my $item ( @stats ) {
        $item->[1]++ if $item->[0] eq 'a3333';
    }
}

sub void_array {
    map { $_->[0] eq 'a3333' and $_->[1]++ } @stats;
}

sub grepper {
    (grep {$_->[0] eq 'a3333'} @stats)[0]->[1]++;
}

timethese (10000, {
    '1. Array neu erstellen    ' => \&rewrite_array,
    '2. Schleife ausformuliert ' => \&loop,
    '3. Array im leeren Kontext' => \&void_array,
    '4. Original einzeilig     ' => \&grepper,
});

print "a3333 ist nun $stats[3333][1]";

Code: (dl )
1
2
3
4
1. Array neu erstellen    : 13 wallclock secs (13.16 usr +  0.00 sys = 13.16 CPU) @ 759.88/s (n=10000)
2. Schleife ausformuliert : 6 wallclock secs ( 6.00 usr + 0.00 sys = 6.00 CPU) @ 1666.67/s (n=10000)
3. Array im leeren Kontext: 7 wallclock secs ( 6.62 usr + 0.00 sys = 6.62 CPU) @ 1510.57/s (n=10000)
4. Original einzeilig : 6 wallclock secs ( 6.07 usr + 0.02 sys = 6.09 CPU) @ 1642.04/s (n=10000)

View full thread Syntax Zugriff Array Index