ein Kapitel zurück                                           ein Kapitel weiter

Wollen sie die Laufzeit eines Programms genau ermitteln, reichen die bisher kennengelernten Funktionen, die auf die Sekunde genau ermitteln, nicht aus. Sie benötigen eine genauere Zeitangabe. Hierfür haben sie mehrere Möglichkeiten.

Möglichkeit 1 :

Die Funktion clock() die in der Headerdatei <time.h> ist, und somit auf jedem System vorhanden ist. Hier der Syntax von clock()....

clock_t clock(void);  

Die Zeiteinheit von clock_t ist nicht eine für den Menschen erkenntliche Zahl, sondern die CPU Ausführungszeit. clock() ist also gut geeignet für eine Messung der CPU-Ausführungszeit eines Programms.

Um aus der Zeiteinheit clock_t eine für den Menschen lesbare Zeiteinheit zu machen gibt es das Makro CLOCKS_PER_SEC. Sie müssen dabei nur die Zeiteinheit in clock_t durch CLOCKS_PER_SEC teilen und erhalten die Angaben in Sekunden dafür.

Hierzu nun das Programmbeispiel zur Laufzeitmessung mit clock().....

/*Download:profile1.c*/
#include <stdio.h> #include <time.h> int main() { long i; float zeit; clock_t start, ende; /*start bekommt die aktuelle CPU-Zeit*/ start = clock(); /*Hier sollte nun der Ausführbare Code stehen für die Laufzeitmessung*/ /*Wir verwenden einfach ein Schleife*/ for(i=0; i<200000000; i++); /*stop bekommt die aktuelle CPU-Zeit*/ ende = clock(); /*Ergebniss der Laufzeitmessung in Sekunden*/ zeit = (float)(ende-start) / (float)CLOCKS_PER_SEC; printf("Die Laufzeitmessung ergab %.2f Sekunden\n",zeit); return 0; }

Wichtig ist übrigens auch das Casting, da ansonsten ein Auf/Abgerundetes Ergebniss nach der Kommastelle erscheint.

Möglichkeit 2 :

Mit der Funktione gettimeofday() die sie im Kapitel zuvor kennengelernt haben. Die Funktion läßt sich genauso einfach einsetzen wie im Beispiel zuvor mit clock(). Hier das Beispiel zu gettimeofday............

/*Download:profile2.c*/
#include <stdio.h> #include <sys/time.h> int main() { long i; struct timeval start, ende; long sekunden, mikrosekunden; /*Sekunden und Mikrosekunden seit 1.1.1970 in start*/ gettimeofday(&start,(struct timezone *)0); /*Hier sollte nun der Ausführbare Code stehen für die Laufzeitmessung*/ /*Wir verwenden einfach ein Schleife*/ for(i=0; i<200000000; i++); /*Sekunden und Mikrosekunden seit 1.1.1970 in ende*/ gettimeofday(&ende, (struct timezone *)0); sekunden = ende.tv_sec - start.tv_sec; mikrosekunden = ende.tv_usec - start.tv_usec; if(mikrosekunden < 0) /*negativer Wert?*/ { mikrosekunden+=1000000; mikrosekunden--; } printf("Laufzeitmessung ergab %ld,%ld Sekunden\n",sekunden,mikrosekunden); return 0; }

Eine etwas fortgeschrittenere Laufzeitmessung können sie mit der Funktion times machen.....

#include <sys/times.h>

clock_t times (struct tms *tms_buffer);  

Mit dieser Funktion können wir außer der Laufzeitmessung die wir für den normalen Programmmodus verbraucht haben noch folgende Zeiten messen.....

struct tms
  {
    clock_t tms_utime;   /* Rechenzeit im Benutzermodus  */
    clock_t tms_stime;   /* Rechenzeit für Systemaufrufe */

    clock_t tms_cutime;  /* Rechenzeiten der Kindprozesse im Benutzermodus  */
    clock_t tms_cstime;  /* Rechenzeiten der Kindprozesse im Systemmodus  */
  };  

Falls sie noch nicht mit Prozessen vertraut sind, brauchen sie sich jetzt noch nicht allzuviel Gedanken über diese Programm machen. Wir kommen noch zu den Prozessen unter Linux.

/*Download:profile3.c*/
#include <stdio.h> #include <sys/times.h> #include <unistd.h> int main(int argc, char **argv) { char *name; int status; long i; struct tms t; /*Prozess kreiern*/ switch(fork()) { case 0 : /*Kindprozess*/ /*Hier könnte der Code für die Laufzeitmessung */ /*vom Kindprozess stehen*/ for(i=0;i<20000000;i++); /*Ein bisschen Zeitverschwenden*/ exit(0); case -1: /*Fehlerfall bei fork*/ fprintf(stderr,"Konnte keinen neuen Prozess erzeugen"); exit(0); default: /*Elternprozess*/ wait(&status); /*Auch im Elternprozess ein wenig trödeln*/ for(i=0;i<100000000;i++); times(&t); printf("Rechenzeit des Kindprozesses :\n"); printf("User-CPU : %lu System-CPU : %lu\n\n", t.tms_cutime, t.tms_cstime); printf("Rechenzeit des Elternprozesses : \n"); printf("User-CPU : %lu System-CPU : %lu\n\n", t.tms_utime, t.tms_stime); } return 0; }

Die Rückgabewerte die sie hier Erhalten sind übrigens clock_t (Clock-Ticks). Wollen sie diese Angaben in Sekunden haben teilen sie clock_t durch CLOCKS_PER_SEC wie sie es in diesem Kapitel schon einmal gesehen haben.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf