#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>

main()
{ 
 { 
  /*************************************************************************/
  /* - Variante 1 - mit Bibliotheksfunktion clock()                        */
  /* - clock() liefert die vom Programm bisher benutzte Prozessorzeit      */
  /* - der Teiler CLOCKS_PER_SEC ist maschinenabhängig und spezifiziert,   */
  /*   wieviel Uhr-Ticks auf der jeweiligen Maschine pro Sekunde vergehen  */
  /* - CLOCKS_PER_SEC definiert also die clock_t-Einheiten pro Sekunde     */
  /* - bei Linux (i[345..]86 glibc):     #define CLOCKS_PER_SEC  1000000   */
  /*************************************************************************/
  int i;
  float z;
  clock_t begin, end;

  printf("Variante 1 - mit clock(3)  \n\n");
  begin = clock();
  for(i=1; i<100000000;i++);
  end = clock();
  printf("begin:                         %d\n", begin);
  printf("end:                           %d\n", end);
  printf("clocks zwischen begin und end: %d\n", end - begin);
  z=end - begin;
  z/=CLOCKS_PER_SEC;
  printf("Zeit zwischen begin und end:   %f Sekunden\n", z);
  printf("CLOCKS_PER_SEC:                %d\n", CLOCKS_PER_SEC);
 }

 {
  /*************************************************************************/
  /* - Variante 2 - mit Systemruf gettimeofday()                           */
  /* - gettimeofday() stellt u.a. die Struktur timeval bereit              */
  /*      struct timeval {                                                 */
  /*           long tv_sec;           Sekunden seit 1.1.1970               */
  /*           long tv_usec;          Mikrosekunden                        */
  /*      };                                                               */
  /*************************************************************************/
  struct timeval begin, end;
  long seconds, useconds;
  int i;


  printf("\n\nVariante 2 - mit gettimeofday(2)  \n\n");
  /* Test mit for-Schleife */
  if (gettimeofday(&begin,(struct timezone *)0)) {
    fprintf(stderr, "can not get time\n");
    exit(1);
  }

  for(i=1; i<100000000;i++);

  if (gettimeofday(&end,(struct timezone *)0)) {
    fprintf(stderr, "can not get time\n");
    exit(1);
  }
  printf("begin:                         %d sec %d usec\n", begin.tv_sec, begin.tv_usec);
  printf("end:                           %d sec %d usec\n", end.tv_sec, end.tv_usec);
  seconds = end.tv_sec - begin.tv_sec;
  useconds = end.tv_usec - begin.tv_usec;
  if(useconds < 0) {
        useconds += 1000000;
        seconds--;
  }   

  printf("Dauer der for-Schleife:        %d sec %d usec\n\n", seconds, useconds);


   /* Test mit sleep() */

  if (gettimeofday(&begin,(struct timezone *)0)) {
    fprintf(stderr, "can not get time\n");
    exit(1);
  }

  sleep(5);

  if (gettimeofday(&end,(struct timezone *)0)) {
    fprintf(stderr, "can not get time\n");
    exit(1);
  }
  printf("begin:                         %d sec %d usec\n", begin.tv_sec, begin.tv_usec);
  printf("end:                           %d sec %d usec\n", end.tv_sec, end.tv_usec);
  seconds = end.tv_sec - begin.tv_sec;
  useconds = end.tv_usec - begin.tv_usec;
  if(useconds < 0) {
        useconds += 1000000;
        seconds--;
  }   
  printf("Dauer sleep(5):                %d sec %d usec\n", seconds, useconds);
 }
 return 0;

}

