views:

512

answers:

5

The C clock() function just returns me a zero. I tried using different types, with no improvement... Is this a good way to measure time with good precision?

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

int main()
{
    clock_t start, end;
    double cpu_time_used;

    char s[32];

    start = clock();

    printf("\nSleeping 3 seconds...\n\n");
    sleep(3);

    end = clock();

    cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);

    printf("start = %.20f\nend   = %.20f\n", start, end);
    printf("delta = %.20f\n", ((double) (end - start)));
    printf("cpu_time_used  = %.15f\n", cpu_time_used);
    printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);

    return 0;
}
Sleeping 3 seconds...

start = 0.00000000000000000000
end   = 0.00000000000000000000
delta = 0.00000000000000000000
cpu_time_used  = 0.000000000000000
CLOCKS_PER_SEC = 1000000

Platform: Intel 32 bit, RedHat Linux, gcc 3.4.6

+3  A: 

clock_t is an integer type. You can't print it out with %f. See Fred's answer for why the difference is 0.

Paul Tomblin
`clock_t` needs to be an arithmetic type, which could be an integer or a floating type. So you might be able to print it out with `%f`, but to be safe(er), the values should be cast to `(double)` in the `printf()` call so it'll work right regardless of whether it's an integer or floating type.
Michael Burr
@Michael, have you ever seen an implementation where it was a floating type? I would imagine that struct tms among other things would be pretty messed up if it was.
Paul Tomblin
I couldn't point you to a specific instance (but then again, unless I look, I don't know if Windows or whatever is using an integer type either). I do know that several platforms use a floating type for `time_t` - I dunno if this means they might be more likely to do similar for `clock_t` or not. The type of `clock_t` should have no impact on `struct tm` at all.
Michael Burr
It's hard to imagine a case where the "number of ticks between two operations" would be non-integer.
Paul Tomblin
Michael Burr
The famous example is the Patriot Missile system. Its clock used floating point. As a result, its absolute precision decreased when the system ran for longer periods of time, such as in the Gulf War. This caused a subsequent loss in guidance accuracy, interception failures, and multiple deaths. So yes, Paul Tomblin is more than right when he says that "things would be pretty messed up"
MSalters
+4  A: 

man clock. It's not returning what you think it is. Also man gettimeofday - it's more likely what you want.

Aidan Cully
+3  A: 
 printf("start = %.20f\nend   = %.20f\n", start, end);

should be:

 printf("start = %d\nend   = %d\n", start, end);
anon
+9  A: 

clock() reports CPU time used. sleep() doesn't use any CPU time. So your result is probably exactly correct, just not what you want.

Fred Larson
You are right. With a for loop with some math inside it returns a reasonable value. Thank you!
Pietro
+1  A: 

Calling sleep() isn't going to use up any CPU time. You should see a little difference, though. I corrected your printf type mismatch bug in this line:

printf("start = %.20f\nend   = %.20f\n", start, end);

And it gave reasonable results on my machine:

start = 1419
end   = 1485
delta = 66
cpu_time_used  = 0.000066000000000
CLOCKS_PER_SEC = 1000000

You might try gettimeofday() to get the real time spent running your program.

Carl Norum