基础知识 | 每日一练(163)

基础知识练习

读者:怎样实现精度小于秒的延时或记录用户回应的时间?

小林:有可移植解决方法。下面是一些你可以在你的系统中寻找的函数: clock(), delay(), ftime(), getimeofday(), msleep(), nap(), napms(),

nanaosleep(), setitimer(), sleep(), Sleep(), times() 和 usleep。

至少在 Unix 系统下, 函数 wait() 不是你想要的。函数 select() 和 poll() (如果存在) 可以用来实现简单的延时。在 MS-DOS 下, 可以重新对系统计时器和计时器中断编程。这些函数中, 只有 clock() 在 ANSI 标准中。

两次调用 clock() 之间的差分就是执行所用的时间, 如果 CLOCKS PER SEC 的值大于 1, 你可以得到精确度小于秒的计时。但是, clock() 返回的是执行程序使用的处理器的时间, 在多任务系统下,有可能和真实的时间相差很多。

如果你需要实现一个延时, 而你只有报告时间的函数可用, 你可以实现一个繁忙等待。但是这只是在单用户, 单任务系统下可选, 因为这个方法对于其它进程极不友好。

在多任务系统下, 确保你调用函数, 让你的进程在这段时间进入休眠状态。可用函数 sleep(), select() 或 poll() 和 alarm() 或 setitimer()实现。

对于非常短暂的延时, 使用一个空循环颇据有诱惑力:

long int i;

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

;

但是请尽量抵制这个诱惑!因为, 经过你仔细计算的延时循环可能在下个月因为更快的处理器出现而不能正常工作。更糟糕的是, 一个聪明的编译器可能注意到这个循环什么也没做, 而把它完全优化掉。

正文完