Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

    Two common errors are made when performing this operation. They are illustrated below.   

Non-compliant Code Examle

Code Block
int run_big_program() {
    clock_t start, finish;
    int seconds;
    start = clock();
    run_long_program()  
    finish = clock();
    seconds = ((finish-start)/CLOCKS_PER_SEC);  
    return seconds;  
}

    The problem here is: 1) the return values of clock() are not checked (this occurs in many implementations of this functionality) and 2) the return value seconds in inappropriate.

    The way to remedy this is to check for return values properly and use an appropriate data structure for the subtraction for the number of seconds. It is implied by the C standard that finish-start will return the number of clock cycles necessary for run_long_program(), so you can be fairly sure of that. It is also implied by the C standard that

C99 Section 7.23.1 states that CLOCKS_PER_SEC expands to a constant expression with type clock_t that is the number per second of the value returned by the clock() function, so dividing by CLOCKS_PER_SEC will net you the number of seconds. What is not specified, however, is the type that will be yielded by dividing CLOCKS_PER_SEC. The best recommendation is to look at the types defined in time.h and use a compatible (and large, to prevent overflow) type. The convention for linux and most x86 architectures seems to be to use a double.   

Compliant

...

Solution

Code Block
double run_big_program ()
{
    clock_t start, finish;
    double seconds;
    start = clock();
    if (start = (clock_t)(-1)){
        return -1.0;
    }
    run_long_program();
     finish = clock();
    if (finish = (clock_t)(-1)){
        return -1.0;
    }
     secondsseconds = (double) (finish-start)/CLOCKS_PER_SEC;
    return seconds;  
}          

   When appropriate one should also check for overflow in seconds.
 

...