Thread Sonderbarer Benchmark (3 answers)
Opened by sosum at 2006-07-18 16:09

sosum
 2006-07-18 16:09
#68201 #68201
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Hi ihrs,

ich habe grad eine sonderbare Feststellung gemacht: die Auswertung eines Listenelements ist teurer(!) als die Berechnung einer Zufallszahl!

In meinem Proggie geht es aktuell darum, aus einer Menge von x-Elementen (targetlimit) jeweils ein (zufälliges) rauszupicken, und zwar y-mal (targetcount).

Hierzu gibt es zwei kleine Bröckchen:
1. Variante ist (frei Schnauze) die rand-Funktion mit Parameter "targetlimit" "targetcount"-mal aufzurufen.

2. Bei der Variante ging es mir darum, die Anzahl der rand() Aufurfe zu reduzieren, da ich erwartet hatte, dass sie teurer sind.
Es werden vorab nur "targetlimit" Zufallszahlen errechnet, und in einer Liste gespeichert. Aus dieser Liste werden nun die Elemente "targetcount" mal abgerufen.

Das Sonderbare ist nun, dass das 2. Verfahren bei mir immer langsamer ist (2-8%) als,das schlichte rand(). Die Schlussfolgerung wäre dann dass rand() SEHR effizient ist.

Hat jemand spontan eine Idee, woran das liegen kann? Ich raffe nicht, warum die 2. Variante so langsam ist.

grüße,
sosum
Code: (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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
sub bench_randomx () {
    # ALLE VERFAHREN
    my $targetcount = 400;     # Anzahl der Elemente, die "ausgewählt" werden müssen
    
    # 2. VARIANTE
    my $targetlimit = 10;    # max. Anzahl gleichzeitig auswählbarer Elemente
    my @cache =();            # cache der Zufallszahlen
    my $cached    = 0;
    
    &println ("Teste auf $targetcount rand()/cachedrand Elemente,");    
    Benchmark::cmpthese(-1, {    
        # Ziel ist es beides Mal, 150 Elemente vorzunehmen
        'random WHILE (1b)'   => sub {
               
 my $i=0;
               
 while ($targetcount >$i) {
               
     int(rand($targetlimit)); 1;
               
     $i++;
               
 }
            },
        ' cachedrand (2)'       => sub {
               
 if (!$cached) {
               
     print "initcache";
               
     my $i=0;
               
     while ($targetlimit >$i) {
               
         push (@cache,int(rand($targetlimit)));
               
         $i++;
               
     }    
               
     $cached=1;
               
 }
               
 my $targeting = 0;
               
 my $tcount = $targetcount;
               
 while ($tcount>0) {
               
     $cache[$targeting];
               
     1;
               
     if (++$targeting== $targetlimit) { $targeting=0;}
               
     $tcount--;
               
 }
            },
        }
    );
    &println ("\nReihenfolge der Elemente in (2):");
    &println (join(",",@cache));
}
\n\n

<!--EDIT|sosum|1153224582-->

View full thread Sonderbarer Benchmark