PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Loop- / SchlaufenZeit messen und ausgeben



Scriptkiddy
19.06.2006, 19:24
Hallo Leutz!

Ich habe (als Hausaufgabe von der lieben Schule) ein kleines Programm geschrieben. Diese berechnet die Zahl Pii. Am Anfang muss man die Auflösungsmatrix eingeben. Je grösser diese Matrix ist, desto genauer wird Pi. Aber natürlich geht es auch viel länger.

Macht aber nix, ist sogar gut so. Es eignet sich bestens für den hmm Sch.... Schnelligkeitsvergleich von des Kollegen Rechners (Mein altes Notebook braucht bei einer Auflösung von 200000*200000 Punkten glatte 14minuten).

Nun das Problem. Ich habe das Programm so umgeschrieben, dass man immer wieder von Neuem einen Wert eingeben kann. Dies hat aber leider zur Folge, dass die Ablaufzeit des Programms nicht mehr angezeigt wird.

Kann ich irgendwie die Zeit einer While-schlaufe messen und per "printf" ausgeben. Natürlich möchte ich meinen Code nicht grundelegend abändern

Hier mein Code:

/*Programm zur Errechnung von Pi*/


#include <stdio.h>


/*Definition der Variablen:

Aufloesung: Entspricht der Dichtheit der Matrix (Aufloesung)
Resultat: Das Endergebnis wird darin gespeichert
Kreistreffer: Aller errechneten Treffer inerhalb des Kreises
Quadrattreffer:Alle Treffer ausserhalb des Kreises
y: Wert für die y- Koordinate
x: Wert für die x- Koordinate*/
int main(void)
{

double aufloesung;

double Resultat;

double Kreistreffer;

double Quadrattreffer;

double y;

double x;

printf("Programm zur Errechnung von Pi\n");
printf("------------------------------\n\n");
printf("Aufloesung fuer Berechnungsmatrix eingeben (je groesser desto genauer und <10=Ende):\n");
scanf("%lf",&aufloesung);
while (aufloesung>=10)
{
x=aufloesung;
y=aufloesung;
Kreistreffer=0;

while (y>=(-aufloesung)) /*Herunterzählen von der y-Koordinate*/
{
printf("Zwischenresultat y:%f ",y);
printf("Zwischenresultat Kreistreffer:%f\n",Kreistreffer);
x=aufloesung;


while (x>=(-aufloesung)) /*Herunterzählen von der x-Koordinate*/
{
if (((x*x) + (y*y)) <= (aufloesung)*(aufloesung))
Kreistreffer = Kreistreffer + 1;
x=x-1;

}



y=y-1;




}
Quadrattreffer= ((2*aufloesung)+1)*((2*aufloesung)+1);
Resultat= (4*Kreistreffer)/Quadrattreffer;
printf("Das Resultat ist:%f\n\n",Resultat);

printf("Programm zur Errechnung von Pi\n");
printf("------------------------------\n\n");
printf("Aufloesung fuer Berechnungsmatrix eingeben (je groesser desto genauer und <10=Ende):\n");
scanf("%lf",&aufloesung);
}
return 0;
}



Für die Antworten danke ich im Voraus.

greets Scriptkiddy 8-[

SprinterSB
20.06.2006, 09:11
Ich nehme mal an, dabei handelt es sich um Standard-C. C hat leider keine Vorstellung von Zeit. Je nach dem, unter welchem Betriebssystem du proggst und welchen C-Compiler du nimmst kommt man anders an die Zeit -- möglicherweise auch garnicht.

Zeitnahmen sind eben sehr maschinenabhängig, während C maschinenunabhängig ist (oder es zu sein versucht, zumindest war es in den Anfängen so konzipiert, gilt heute bei weitem nicht mehr)

Scriptkiddy
20.06.2006, 11:20
Ja es handelt sich um standart C

Kann man das Progie irgendwie an die Systemzeit anknüpfen? Mir wäre es ja eigentlich egal wenn es "nur" auf XP laufen würde. Ich kann mir schlecht vorstellen, dass es für so ein "grundlagen"-Problem nicht irgend eine Lösung gibt.

Greets Scriptkiddy

SprinterSB
20.06.2006, 11:55
Da musst du eben in der Dokumentation zu deinem Compiler wühlen, da ist die API von Compiler zu Compiler verschieden -- eben weil sowas nicht zum Standard gehört. Evtl geht sowas wie date, gettimeofday, time, gmtime, localtime, difftime, etc.

Schockwellenreiter
20.06.2006, 12:59
Vielleicht kann dir das weiterhelfen.
http://osg.informatik.tu-chemnitz.de/fileadmin/user_upload/material/sysprog06/unterlagen2.pdf
Kapitel 1.2
Ich hab es aber selbst nicht versucht, also keine Garantie ;)

sast
20.06.2006, 14:04
LONGLONG l1=0;
PLONGLONG pl1=&l1;

__asm {
push eax ; Save registers we will overwrite (eax, ebx, edx).
push ebx
push edx
_emit 0x0F ; The RDTSC instruction consists of these two bytes.
_emit 0x31
mov ebx, pl1 ; Put the address where the timestamp goes in ebx.
mov [ebx],eax ; Save low 4 bytes of timestamp there.
mov [ebx+4],edx ; Save high 4 bytes of timestamp next.
pop edx ; Restore overwritten registers.
pop ebx
pop eax
}
so hab ichs mal gemacht

EDIT: Wenn du das einmal am Anfang und einmal am Ende machst hast du deine Zeitdiff.

sast