/* Solution to ICS 331 assignment #1
 * by David N. Chin
 * measure the execution time difference between 100,000 addition,
 * multiplication and division operations for int, short, long, float, double
 * and long float data types
 */

#include <stdio.h>
#include <time.h>  /* needed for clock() */
#include <sys/times.h>
#define ITERATIONS 10000000
#define VERBOSE 0

time_t start_time();
void print_time(char *msg, time_t start);

main() {
  clock_t start;
  int a = 33, b = 3, c;
  long al = 33, bl = 3, cl;
  long long all = 33, bll = 3, cll;
  short as = 33, bs = 3, cs;
  float af = 33.3, bf = 3.3, cf;
  double ad = 33.3, bd = 3.3, cd;
  long double ald = 33.3, bld = 3.3, cld;
  unsigned long i;

  printf("CLOCKS_PER_SEC is %d\n", CLOCKS_PER_SEC);
  printf("ITERATIONS is %d bytes\n", ITERATIONS);
  printf("Size of short is %d bytes\n", sizeof(as));
  printf("Size of int is %d bytes\n", sizeof(a));
  printf("Size of long is %d bytes\n", sizeof(al));
  printf("Size of float is %d bytes\n", sizeof(af));
  printf("Size of double is %d bytes\n", sizeof(ad));
  printf("Size of long double is %d bytes\n", sizeof(ald));

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    c = a + b;
  }
  print_time("int addition", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    c = a * b;
  }
  print_time("int multiplication", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    c = a / b;
  }
  print_time("int division", start);


  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cs = as + bs;
  }
  print_time("short addition", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cs = as * bs;
  }
  print_time("short multiplication", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cs = as / bs;
  }
  print_time("short division", start);


  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cl = al + bl;
  }
  print_time("long addition", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cl = al * bl;
  }
  print_time("long multiplication", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cl = al / bl;
  }
  print_time("long division", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cf = af / bf;
  }
  print_time("float addition", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cf = af * bf;
  }
  print_time("float multiplication", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cf = af / bf;
  }
  print_time("float division", start);


  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cd = ad / bd;
  }
  print_time("double addition", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cd = ad * bd;
  }
  print_time("double multiplication", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cd = ad / bd;
  }
  print_time("double division", start);


  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cld = ald / bld;
  }
  print_time("long double addition", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cld = ald * bld;
  }
  print_time("long double multiplication", start);

  start = start_time();
  for(i=0; i< ITERATIONS; i++) {
    cld = ald / bld;
  }
  print_time("long double division", start);
}

/* get the CPU time, print it if VERBOSE==1 and return it */
time_t start_time() {
  time_t start = clock();
  if(VERBOSE) printf("start clock time is %d\n", start);
  return start;
}  

/* get the CUP time, print it if VERBOSE==1 and print the difference
 * between the current CPU time and the start CPU time
 */
void print_time(char *msg, time_t start) {
  double cpu_time_used;
  time_t end = clock();

  if(VERBOSE) printf("end clock time is %d\n", end);

  cpu_time_used = ((double)(end - start))/CLOCKS_PER_SEC;
  printf("Time for %s: %f\n", msg, cpu_time_used);
}

     
