Schrift
[thread]8174[/thread]

Sonderbarer Benchmark



<< >> 4 Einträge, 1 Seite
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-->
Strat
 2006-07-18 16:21
#68202 #68202
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
vielleicht hiflt dir CPAN:Devel::SmallProf beim benchmarken...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sosum
 2006-07-18 16:53
#68203 #68203
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Danke für den Tip! Ich habe das Modul installiert, doch das Ergebnis bleibt (für mich) verwirrend:

Code: (dl )
1
2
3
4
5
6
440 0.000582 0.000000    88:  if (++$targeting== $targetlimit) {
400 0.000554 0.000000    86:  $cache[$targeting];
400 0.000549 0.000000    89:  $tcount--;

wird konfrontiert mit:
800 0.000288 0.000000    72:  int(rand($targetlimit)); 1;

lollig ist aber das hier:
Code: (dl )
      400 0.000457 0.016000    87:  1;

Was so ne "eins" alles kostet :(\n\n

<!--EDIT|sosum|1153227272-->
Strat
 2006-07-18 17:02
#68204 #68204
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das ist ja auch eine spezielle eins...

das gibt fuer jede zeile an, wie lange die ausfuehrung dieser zeile brauchte; ist manchmal hilfreicher als Devel::DProf
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 4 Einträge, 1 Seite



View all threads created 2006-07-18 16:09.