Benchmark-Funktion akzeptabel?



  • ntag,

    mein kleines [url="http://www.forum-3dcenter.de/vbulletin/showthread.php?t=271818"]Programm[/url] liefert nicht die erwarteten Benchmark-Ergebnisse. Daher hier mal ein Code-Auszug. Ist sowas überhaupt geeignet um die Leistungsfähigkeit von Prozessoren grob zu vergleichen?

    #include <time.h>
    #include <iostream.h>
    #include <conio.h>
    
    long MISCHergebnis;
    short startMISCH=0, endMISCH=0, MISCHzeit;
    
    void main()
    {
    
    //strartzeit nehmen
    startMISCH = clock();
    
    //1000000x durchlaufen
    for (long MISCHcounter=0;MISCHcounter<1000000;MISCHcounter++)
    {
    //und Zufallszahlen in allen Möglichen Formen miteinenader verrechnen
    srand (time(NULL));
    MISCHergebnis=tan(rand()%215)+rand()%144-rand()%79*rand()%31/((rand()%4)+1)-sqrt(rand()%5)-(rand()%5)%6;
    }
    
    //Endzeit nehmen
    endMISCH=clock();
    
    MISCHzeit = endMISCH-startMISCH;
    
    cout << MISCHzeit;
    
    getch();
    }
    

    lg



  • Nein.



  • Benutze die cpp Tags, dann ist das ganze schön bunt 😃

    #include <time.h>
    #include <iostream.h>
    #include <conio.h>
    
    long MISCHergebnis;
    short startMISCH=0, endMISCH=0, MISCHzeit;
    
    void main()
    {
    
    //strartzeit nehmen
    startMISCH = clock();
    
    //1000000x durchlaufen
    for (long MISCHcounter=0;MISCHcounter<1000000;MISCHcounter++)
    {
    //und Zufallszahlen in allen Möglichen Formen miteinenader verrechnen
    srand (time(NULL));
    MISCHergebnis=tan(rand()%215)+rand()%144-rand()%79*rand()%31/((rand()%4)+1)-sqrt(rand()%5)-(rand()%5)%6;
    }
    
    //Endzeit nehmen
    endMISCH=clock();
    
    MISCHzeit = endMISCH-startMISCH;
    
    cout << MISCHzeit;
    
    getch();
    }
    

    Das srand(time(NULL)); sollte nur einmal aufgerufen werden und nicht vor jedem rand. Am besten ganz an den Anfang der main und dann nie wieder.

    mfg.



  • klare Antwort: schrieb:

    Nein.

    Hey cool, danke *kopfschüttel*

    joomoo schrieb:

    Das srand(time(NULL)); sollte nur einmal aufgerufen werden und nicht vor jedem rand. Am besten ganz an den Anfang der main und dann nie wieder.

    mfg.

    Das würde dann bedeuten, dass ich mit ein und demselben Zufallswert 1million mal das gleiche mache => sinnlos.

    lg



  • dav133 schrieb:

    klare Antwort: schrieb:

    Nein.

    Hey cool, danke *kopfschüttel*

    joomoo schrieb:

    Das srand(time(NULL)); sollte nur einmal aufgerufen werden und nicht vor jedem rand. Am besten ganz an den Anfang der main und dann nie wieder.

    mfg.

    Das würde dann bedeuten, dass ich mit ein und demselben Zufallswert 1million mal das gleiche mache => sinnlos.

    lg

    Nein, das machst du derzeit so, da time nur sekunden-genau ist und die schleife mehrfach pro sekunde durchläuft.



  • dav133 schrieb:

    joomoo schrieb:

    Das srand(time(NULL)); sollte nur einmal aufgerufen werden und nicht vor jedem rand. Am besten ganz an den Anfang der main und dann nie wieder.

    mfg.

    Das würde dann bedeuten, dass ich mit ein und demselben Zufallswert 1million mal das gleiche mache => sinnlos.

    lg

    Nein, das bedeutet es nicht - srand() initialisiert den Zufallszahlen-Generator auf einen Startwert, von dem aus er bei jedem Aufruf von rand() eine neue Zufallszahl erzeugt:

    static int rseed;
    
    void srand(int st)
    {
      rseed = st;
    }
    
    int rand()
    {
      rseed = random_fkt(rseed);
      return rseed;
    }
    

    Wenn du vor jedem rand()-Aufruf srand neu aufrufst, wird der Startwert immer wieder auf den selben Wert zurückgesetzt - DADURCH erzeugst du jedes Mal die selbe Zufallszahl.



  • Hallo,

    um mal zu der eigentlichen Frage zurückzukommen.
    Es gibt ja viele Benchmarks. Wenn dich eher die CPU nur interessiert bzw. die
    FPU in der CPU (Floting Point Unit) kannst Du das machen wie beschrieben.
    Interessiert dich aber z.B. der Speicherbus und der Arbeitsspeicher, was ja für viele Programme nicht minder von Bedeutung ist, dann musst Du z.B. einen grossen Vektor erzeugen length~10.000.000 der hat dann als double ca. 80MB Größe.
    Auf diesem Vektor kannst Du dann irgendwelche Operationen machen, nur sollten die wiederum nicht auf der FPU hängen. Wichtig ist immer die Frage was ist der Flaschenhals im System. Das ist was Du grad testest.

    Das sind mal meine Gedanken zu dem Thema, zweifelsohne kann man das alles viel besser machen.



  • Hmm, danke :).

    Da hab ich nur das Problem: Welche Variable frisst millionen von Stellen? Gleiches PRoblem hab ich grad mit der Fakultät. 100! wird doch schon sehr groß. Es muss doch mögklichkeiten geben, diese sehr Rechenintensive Opereationen auch für Zahlen wie zb 100000 möglich zu machen, oder?

    lg



  • Es geht nicht um die mathematische Größe der Zahl oder besser gesagt um ihren Betrag sondern um die Größe der Variable.
    wenn du:

    long int dim = 10000000;
    array = new double[dim];
    for (long int i=0; i<dim; ++i){
       array[i] = 1/ (double)i;
    }
    

    Dauert das schon einen Augenblick, da im Speicher 10mio. Variablen liegen, ca 80MB.
    Wenn Du das noch mal in eine Schleife einpackst kannst Du die Laufzeit so erhöhen wie es Dir gefällt. Dann kannst Du dim erhöhen bis dein Rechner anfängt zu swapen.

    mfG cris492


Anmelden zum Antworten