linux下usleep nanosleep select的比较经历

sleep:单位为秒,1秒
usleep:单位为微秒,1/1000 秒
select:单位为微秒,1/1000 000 秒
nanosleep:单位为毫微秒,也就是纳秒,1/1000 000 000 秒

现把比较代码贴出来:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
struct timeval tvBegin;
struct timeval tvNow;
struct timeval tv;
unsigned int nDelay;
struct timespec req;
unsigned int nTimeTest = 0;
int nReduce = 0;
fd_set rfds;
int fd = 1000;
unsigned int delay[20] =
{1000000,500000, 100000, 50000, 10000, 1000, 900, 500, 100, 10, 1, 0 };
int i;

for(i=0;i<11;i++)
{
/* test usleep /
gettimeofday (&tvBegin, NULL);
nDelay = delay[i];
int ret = usleep (nDelay);
if (-1 == ret)
{
fprintf (stderr, " usleep error . errno=%d [%s]\n", errno, strerror (errno));
}
gettimeofday (&tvNow, NULL);
nTimeTest =(tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec;
nReduce = nTimeTest - nDelay;
fprintf (stderr, “\t usleep %8uus real:%8uus diff:%8dus\n”, nDelay, nTimeTest, nReduce);
/
test nanosleep */
gettimeofday (&tvBegin, NULL);
req.tv_sec = nDelay / 1000000;
req.tv_nsec = (nDelay % 1000000) * 1000;
ret = nanosleep (&req, NULL);
if (-1 == ret)
{
fprintf (stderr, “\t nanosleep %8u not support\n”,nDelay);
}
else
{
gettimeofday (&tvNow, NULL);
nTimeTest = (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec -tvBegin.tv_usec;
nReduce = nTimeTest - nDelay;
fprintf (stderr, “\t nanosleep %8uus real:%8uus diff:%8dus\n”, nDelay,nTimeTest, nReduce);
}

/* test select */
gettimeofday (&tvBegin, NULL);
FD_ZERO (&rfds);
FD_SET (fd, &rfds);
tv.tv_sec = nDelay / 1000000;
tv.tv_usec = (nDelay % 1000000);
ret = select (fd+1, NULL, NULL, NULL, &tv);
if (-1 == ret)
{
fprintf (stderr, " select error . errno=%d [%s]\n", errno, strerror (errno));
}
gettimeofday (&tvNow, NULL);
nTimeTest =(tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec;
nReduce = nTimeTest - nDelay;
fprintf (stderr, “\t select %8uus real:%8uus diff:%8dus\n”, nDelay, nTimeTest, nReduce);
}
return 0;
}

以上程序x86运行结果如下:
在这里插入图片描述

armv7 多线程下运行结果如下:HZ=100
在这里插入图片描述
armv7 单线程下运行结果如下:HZ=100
在这里插入图片描述

结论:
Linux x86下:短延时<10ms 推荐使用select函数,因为更准确.
arm-linux下:
不管延时时间多少,usleep,nanosleep,select都有10ms~20ms的误差,当然时间越大相对越准确。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值