/* Ivan Novick This code is completely free to be used by anyone for any purpose. April 7, 2010 gettimeofday_diff.c */ #include #include #include /* required for testcode only not for micros_elapsed function */ unsigned int micros_elapsed (struct timeval *begin, struct timeval *end) { const unsigned int million = 1000000; unsigned int result; unsigned int end_tv_sec; unsigned int end_tv_usec; /* do the carry */ if (end->tv_usec < begin->tv_usec) { end_tv_sec = end->tv_sec - 1; end_tv_usec = end->tv_usec + million; } else { end_tv_sec = end->tv_sec; end_tv_usec = end->tv_usec; } result = end_tv_sec - begin->tv_sec; result *= million; result += (end_tv_usec - begin->tv_usec); return result; } int main(int argc, char** argv) { const unsigned int million = 1000000; struct timeval begin; struct timeval end; unsigned int elapsed; unsigned int testsleep = million; while (1) { printf("sleep = %d micros\n", testsleep); gettimeofday(&begin, NULL); usleep(testsleep); gettimeofday(&end, NULL); elapsed = micros_elapsed(&begin, &end); printf("elapsed = %d micros\n\n", elapsed); /* gradually adjust sleep so it sometimes is below 1 second and sometimes above the purpose is to verify the carry code in the subtraction is working fine */ if (elapsed < million) { testsleep += 5; } else { testsleep -= 5; } } return 0; }