Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Measuring elapsed time in linux for a c program

Tags:

c

linux

time

I am trying to measure elapsed time in Linux. My answer keeps returning zero which makes no sense to me. Below is the way i measure time in my program.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

main()
{
    double p16 = 1, pi = 0, precision = 1000;
    int k;
    unsigned long micros = 0;
    float millis = 0.0;
    clock_t start, end;
    start = clock();
    // This section calculates pi
    for(k = 0; k <= precision; k++)
    {
        pi += 1.0 / p16 * (4.0 / (8 * k + 1) - 2.0 / (8 * k + 4) - 1.0 / (8 * k + 5) - 1.0 / (8 * k + 6));
        p16 *= 16;
    }
    end = clock();
    micros = end - start;
    millis = micros / 1000;
    printf("%f\n", millis); //my time keeps being returned as 0

    printf("this value of pi is  : %f\n", pi);
}
like image 880
Jack welch Avatar asked Feb 04 '13 08:02

Jack welch


Video Answer


1 Answers

Three alternatives

  1. clock()
  2. gettimeofday()
  3. clock_gettime()

clock_gettime() goes upto nanosecond accuracy and it supports 4 clocks.

  • CLOCK_REALTIME

    System-wide realtime clock. Setting this clock requires appropriate privileges.

  • CLOCK_MONOTONIC

    Clock that cannot be set and represents monotonic time since some unspecified starting point.

  • CLOCK_PROCESS_CPUTIME_ID

    High-resolution per-process timer from the CPU.

  • CLOCK_THREAD_CPUTIME_ID

    Thread-specific CPU-time clock.

You can use it as

#include <time.h>

struct timespec start, stop;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

/// do something

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);

double result = (stop.tv_sec - start.tv_sec) * 1e6 + (stop.tv_nsec - start.tv_nsec) / 1e3;    // in microseconds
like image 176
Shreevardhan Avatar answered Oct 06 '22 07:10

Shreevardhan