C usleep()用于计算运行时间的行为异常
我使用下面的代码计算每个连续调用处理函数所花费的时间(毫秒)。当我使用usleep1000(即1毫秒)时,每次调用之间的时间差为10毫秒;当我使用usleep1000000(即1秒)时,每次调用之间的时间间隔下降到1毫秒以下。以下是代码片段:C usleep()用于计算运行时间的行为异常,c,gettimeofday,usleep,C,Gettimeofday,Usleep,我使用下面的代码计算每个连续调用处理函数所花费的时间(毫秒)。当我使用usleep1000(即1毫秒)时,每次调用之间的时间差为10毫秒;当我使用usleep1000000(即1秒)时,每次调用之间的时间间隔下降到1毫秒以下。以下是代码片段: #include<stdio.h> #include<stdlib.h> #include<sys/time.h> #include<unistd.h> struct
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<unistd.h>
struct timeval start_time;
void handler(int);
int main()
{
struct timeval current_time;
int i=0;
gettimeofday(&start_time,0);
gettimeofday(¤t_time,0);
printf("%012.3fms: emulationbegins\n",((current_time.tv_usec-start_time.tv_usec)/1000.0));
while(i++<5)
{
usleep(1000); // compare with usleep(1000000)
handler(i);
}
return 0;
}
void handler(int i)
{
printf("In Handler %d\n",i);
struct timeval current_time;
gettimeofday(¤t_time,0);
printf("%012.3fms: Handler Called\n",((current_time.tv_usec-start_time.tv_usec)/1000.0));
return;
}
请记住,timeval结构的tv_usec字段永远不会达到或超过一百万,相反,秒数会增加
在计算中还必须使用tv_sec字段。usleep被指定为睡眠至少与您给定的睡眠量相同,但它可以睡得更长。对于它的睡眠时间几乎没有上限,因为如果操作系统有更重要的进程要运行,它就不必运行您的进程
实际上,usleep睡眠时间的分辨率取决于操作系统使用的时钟。直到几年前,大多数类unix系统都使用静态100Hz定时器或1024Hz(在某些罕见的情况下)来驱动这样的定时器,因此您的usleep总是被四舍五入到最接近的10ms
最近在一些系统上做了一些消除静态时钟的工作,尽管这并不是因为需要更高分辨率的休眠,而是因为不断唤醒cpu以获取静态时钟对功耗有害。它可能会有一个副作用,即提高计时器分辨率,但这反过来又会暴露出应用程序中的错误,这些应用程序使用很短的睡眠时间,并且似乎表现正常。突然间,由于usleep/nanosleep/poll/select中超时的分辨率更高,这些短睡眠会导致应用程序在cpu上旋转,从而一直重新安排睡眠时间
我不确定现在的状态是什么,但从10毫秒看,您的系统似乎仍然使用100赫兹的时钟作为内部计时器,或者它故意将超时速度降低到10毫秒的分辨率,以防止应用程序中断。Ya我错过了这一点。。。谢谢我还有一个相关的问题。纠正错误后,usleep1000和usleep1000000显示出合理的差异,但usleep1000和usleep5000几乎相同。为什么???@vikas_2kx usleep函数睡眠时间至少达到给定的数量,如果计时器分辨率不够高,它实际上可能睡眠时间更长。哦,谢谢你提供的信息。这解释了很多。