### Question 19.37

How can I implement a delay, or time a user's response, with sub-second resolution?

Unfortunately, there is no portable way. V7 Unix, and derived systems, provided a fairly useful `ftime` routine with resolution up to a millisecond, but it has disappeared from System V and POSIX. Other routines you might look for on your system include `clock`, `delay`, `gettimeofday`, `msleep`, `nap`, `napms`, `setitimer`, `sleep`, `times`, and `usleep`. (A routine called `wait`, however, is at least under Unix not what you want.) The `select` and `poll` calls (if available) can be pressed into service to implement simple delays. On MS-DOS machines, it is possible to reprogram the system timer and timer interrupts.

Of these, only `clock` is part of the ANSI Standard. The difference between two calls to `clock` gives elapsed execution time, and if CLOCKS_PER_SEC is greater than 1, the difference will have subsecond resolution. However, `clock` gives elapsed processor time used by the current program, which on a multitasking system may differ considerably from real time.

If you're trying to implement a delay and all you have available is a time-reporting function, you can implement a CPU-intensive busy-wait, but this is only an option on a single-user, single-tasking machine as it is terribly antisocial to any other processes. Under a multitasking operating system, be sure to use a call which puts your process to sleep for the duration, such as `sleep` or `select`, or `pause` in conjunction with `alarm` or `setitimer`.

For really brief delays, it's tempting to use a do-nothing loop like

    	long int i;
    	for(i = 0; i < 1000000; i++)
    		;

but resist this temptation if at all possible! For one thing, your carefully-calculated delay loops will stop working next month when a faster processor comes out. Perhaps worse, a clever compiler may notice that the loop does nothing and optimize it away completely.

References: H&S Sec. 18.1 pp. 398-9
PCS Sec. 12 pp. 197-8,215-6
POSIX Sec. 4.5.2

Read sequentially: prev next up top

This page by Steve Summit // Copyright 1995 // mail feedback