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

haj
 2019-08-11 20:43
#190361 #190361
User since
2015-01-07
551 articles
BenutzerIn

user image
2019-08-11T12:59:55 FIFO
Zwei Dinge muss man allerdings bedenken:
* Bei (sehr) großen Arrays kann das länger als nötig dauern

Ich bin mal neugierig geworden und habe das vermessen. Die ausformulierte Liste ist tatsächlich die schnellste Möglichkeit. Sie gibt außerdem die Möglichkeit, die Schleife nach einem Treffer vorzeitig abzubrechen, falls nur ein Element geändert werden soll.

Das map läßt sich im vorliegenden Fall allerdings auch beschleunigen, wenn man die Liste nicht neu aufbaut. Dann wird einfach das Element in der Original-Liste hochgezählt.

Hier der Vergleichscode:
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
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' ? [$_->[0], $_->[1] + 1] : $_ } @stats;
}

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

und das Resultat:
Code: (dl )
1
2
3
4
5
6
7
Benchmark: timing 10000 iterations of 
1. Array neu erstellen ,
2. Schleife ausformuliert ,
3. Array im leeren Kontext...
1. Array neu erstellen : 18 wallclock secs (17.64 usr + 0.00 sys = 17.64 CPU) @ 566.89/s (n=10000)
2. Schleife ausformuliert : 8 wallclock secs ( 7.97 usr + 0.00 sys = 7.97 CPU) @ 1254.71/s (n=10000)
3. Array im leeren Kontext: 8 wallclock secs ( 8.54 usr + 0.01 sys = 8.55 CPU) @ 1169.59/s (n=10000)


Der Aufbau eines Hash ist nochmal erheblich langsamer, für einen einzigen Zugriff lohnt sich das nicht.

View full thread Syntax Zugriff Array Index