PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benchmark in C++


dav133
2006-01-11, 20:20:04
ntag,

mein kleines Programm (http://www.forum-3dcenter.de/vbulletin/showthread.php?t=271818) 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

Coda
2006-01-11, 20:23:35
Im Prinzip schon. Nur wird ein short mit Sicherheit überlaufen bei der Zeitmessung X-D
Solche "Benchmarks" sind aber nun wirklich nicht sehr praxisnah.

Und es gibt KEIN <iostream.h>. Der Header war nie im C++-Standard enthalten und ist BÖSE.

dav133
2006-01-11, 20:28:35
Im Prinzip schon. Nur wird ein short mit Sicherheit überlaufen bei der Zeitmessung X-D
Solche "Benchmarks" sind aber nun wirklich nicht sehr praxisnah.

Und es gibt KEIN <iostream.h>. Der Header war nie im C++-Standard enthalten und ist BÖSE.Hmm ja, aber schön einfach :). Das mit dem short wird in der Tat knapp, zumindest wenn es noch ne CPU gibt die 32sec für diesen läppischen Vorgang braucht. Ich hab irgendwie Angst, dass die Zeitnehm-Funktion Resourcen schluckt oder die Zufallszahlen das etwas verundeutlichen. Wenn ich die aber rauslass, dann macht er 1XXXXXX x die selbe Operation, was ja auch doof ist.

lg

Trap
2006-01-11, 21:11:15
srand (time(NULL)); in der Schleife ist ziemlich blöd. Das misst hauptsächlich die Zeit die time(0) braucht, der Rest ist vernachlässigbar dagegen.

Die Performance von rand() zu benchen ist zwischen verschiedenen Compilern nicht vergleichbar, da die Implementierung nicht vorgeschrieben ist.

Was willst du genau benchmarken? Ich halte nicht viel davon irgendwas zu benchen was nichts sinnvolles macht...

Coda
2006-01-11, 21:47:49
Hmm ja, aber schön einfachWas ist daran einfacher <iostream> zu verwenden und "using namespace std;" drunterzuschreiben?

Dann ist es wenigstens ein C++-Programm. So werden es neuere Compiler gar nicht mehr fressen.

Expandable
2006-01-11, 22:13:41
Was ist daran einfacher <iostream> zu verwenden und "using namespace std;" drunterzuschreiben?

Dann ist es wenigstens ein C++-Programm. So werden es neuere Compiler gar nicht mehr fressen.

Ach, iostream.h ist nicht im Namespace std? Ich wusste doch, dass das früher auch ohne std ging ;))

Legolas
2006-01-12, 00:21:23
Ach, iostream.h ist nicht im Namespace std? Ich wusste doch, dass das früher auch ohne std ging ;))

iostream.h kann alles sein, weil nirgends standardisiert ist, was da drinzustehen hat.

Coda
2006-01-12, 00:25:20
Ach, iostream.h ist nicht im Namespace std? Ich wusste doch, dass das früher auch ohne std ging ;))Der korrekte und standarisierte Header ist <iostream>, was in iostream.h drin steht ist wie Legolas schon sagte völlig undefiniert.

Es gab noch nie einen C++-Standard mit <iostream.h> und das ist jetzt schon 8 Jahre alt. Langsam sollte man es endlich bleiben lassen dieses Zeug zu verwenden. Seit VC++ 2003 liefert MS (vernünftigerweise) die Header auch einfach nicht mehr mit.

dav133
2006-01-12, 11:20:09
srand (time(NULL)); in der Schleife ist ziemlich blöd. Das misst hauptsächlich die Zeit die time(0) braucht, der Rest ist vernachlässigbar dagegen.

Die Performance von rand() zu benchen ist zwischen verschiedenen Compilern nicht vergleichbar, da die Implementierung nicht vorgeschrieben ist.

Was willst du genau benchmarken? Ich halte nicht viel davon irgendwas zu benchen was nichts sinnvolles macht...Hmm, durch Rechenoperationen soll die Rechenleistung bestimmt werden, wie oben geschrieben. Es soll eine Vergleichbarkeit auf verschiedenen CPU's gewährleistet sein. Das das rand sehr viel Performance schluckt, ist mir auch klar. Aber auch eine Art zu benchen. Ist doch egal, ob das bei anderen Compilern anders ist, wenn einmal ne .exe erstellt wurde ists doch wurscht.

lg

Coda
2006-01-12, 12:12:40
Fragt sich nur was du hier messen willst. Die Performance beim Ausführen der rand-Funktion ist nicht wirklich praxisrelevant X-D

GloomY
2006-01-12, 13:00:31
Da das Ergebnis der Berechnung (MISCHergebnis) nirgendwo verwendet wird und der Ausdruck keine Nebeneffekte hat, könnte es auch sein, dass der Compiler die Berechnung gar nicht ausführt sondern nur die sieben rand() Aufrufe macht.

Um die Arithmetikleistung einer CPU zu testen, ist das sicher nicht geeignet...

dav133
2006-01-12, 13:37:23
Da das Ergebnis der Berechnung (MISCHergebnis) nirgendwo verwendet wird und der Ausdruck keine Nebeneffekte hat, könnte es auch sein, dass der Compiler die Berechnung gar nicht ausführt sondern nur die sieben rand() Aufrufe macht.

Um die Arithmetikleistung einer CPU zu testen, ist das sicher nicht geeignet...Doch, weiter hinten im Programm werden alle einzelergebnisse noch einmal miteinander verrechnet. Aber ich muss Zufallszahlen nehmen, denn 1xxxxx x die gleiche Rechnung durchzuführen ... nee.

lg

Coda
2006-01-12, 17:43:25
Aber ich muss Zufallszahlen nehmen, denn 1xxxxx x die gleiche Rechnung durchzuführen ... neeDas spielt doch keine Roll. Integer-Arithmetik ist immer gleich schnell auf modernen Prozessoren unabhängig vom Input.