`
ruilinruirui
  • 浏览: 1051304 次
文章分类
社区版块
存档分类
最新评论

再论精确延时(usleep,nanosleep,select)

 
阅读更多

转载自:http://www.lslnet.com/linux/dosc1/18/linux-188816.htm

测试
IBM AIX 3.4 单CPU
sleep可以在多线程中使用,只阻塞本线程,不影响所属进程中的其它线程
不支持 nanosleep
支持 usleep和 select
以下采用 gettimeofday 对 usleep 和 select 的实际精确情况进行测试分析
functiontime(usec) realTime reduce
-------------------------------------------------------------------
usleep 500000 500026 26
nanosleep 500000 not support
select 500000 500026 26
usleep 100000 100021 21
nanosleep 100000 not support
select 100000 100025 25
usleep 50000 50021 21
nanosleep 50000 not support
select 50000 50107 107
usleep 10000 10099 99
nanosleep 10000 not support
select 10000 10025 25
usleep 1000 1021 21
nanosleep 1000 not support
select 1000 1024 24
usleep 900 920 20
nanosleep 900 not support
select 900 1024 124
usleep 500 523 23
nanosleep 500 not support
select 500 1024 524
usleep 100 119 19
nanosleep 100 not support
select 100 1023 923
usleep 10 31 21
nanosleep 10 not support
select 10 1024 1014
usleep 1 19 18
nanosleep 1 not support
select 1 1026 1025


由此可以得出,在AIX 3.4下:
select 只能精确到毫秒级别
usleep 可以精确到微秒级
在1毫秒以上,两者的精确度基本一样

同上,在 linux 2.4.20-8smp 双CPU 下测试
functiontime(usec) realTime reduce
-------------------------------------------------------------------
usleep 500000 506453 6453
nanosleep 500000 509930 9930
select 500000 499990 -10
usleep 100000 110023 10023
nanosleep 100000 109955 9955
select 100000 99992 -8
usleep 50000 59971 9971
nanosleep 50000 59990 9990
select 50000 50025 25
usleep 10000 19991 9991
nanosleep 10000 19988 9988
select 10000 9956 -44
usleep 1000 19990 18990
nanosleep 1000 19989 18989
select 1000 10024 9024
usleep 900 20009 19109
nanosleep 900 19972 19072
select 900 9943 9043
usleep 500 19975 19475
nanosleep 500 19971 19471
select 500 10012 9512
usleep 100 19975 19875
nanosleep 100 19976 19876
select 100 9943 9843
usleep 10 19988 19978
nanosleep 10 19961 19951
select 10 10011 10001
usleep 1 19978 19977
nanosleep 1 19985 19984
select 1 9932 9931
在 2.4.21-4.ELsmp #1 SMP4 CPU 下测试
functiontime(usec) realTime reduce
-------------------------------------------------------------------
usleep 500000 501267 1267
nanosleep 500000 509964 9964
select 500000 499981 -19
usleep 100000 109944 9944
nanosleep 100000 109925 9925
select 100000 99963 -37
usleep 50000 59904 9904
nanosleep 50000 59973 9973
select 50000 49956 -44
usleep 10000 19988 9988
nanosleep 10000 20008 10008
select 10000 10020 20
usleep 1000 19988 18988
nanosleep 1000 19980 18980
select 1000 9943 8943
usleep 900 19975 19075
nanosleep 900 19986 19086
select 900 9905 9005
usleep 500 19989 19489
nanosleep 500 19910 19410
select 500 10000 9500
usleep 100 19355 19255
nanosleep 100 19902 19802
select 100 9988 9888
usleep 10 19977 19967
nanosleep 10 19988 19978
select 10 9943 9933
usleep 1 20007 20006
nanosleep 1 19947 19946
select 1 9980 9979

由此可以得出如下结论,在 linux 2.4 下:
1、支持 usleep,nanosleep,select
2、select 的 精确度为 10毫秒。在10毫秒以上很精确
3、usleep, nanosleep很不精确
同样,通过其它测试程序能得出如下结论:
sleep可以在多线程中使用,只阻塞本线程,不影响所属进程中的其它线程



我只有以上3种测试环境,有其它测试环境的帮我在其它环境下测试一下,将分析结果贴出来。
测试程序在之后发上来
<!-- <tr> <td bgcolor="#f0f3fa"> <table cellspacing="0" cellpadding="0" width="100%"> <td class="bold">bashfulboy</td> <td align="right">2004-6-4 03:12</td> </tr> </table> </td> </tr> -->再论精确延时(usleep,nanosleep,select)

/*
make:gcc -o test_sleep test_sleep.c
*/
/* #include"comm_main.h" */
#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>;

#define PRINT_USEAGE{ /
fprintf(stderr,"/n Usage: %s usec ",argv[0]); /
fprintf(stderr,"/n/n");/
}

int
main (int argc, char **argv)
{
unsigned int nTimeTestSec = 0; /* sec */
unsigned int nTimeTest = 0; /* usec */
struct timeval tvBegin;
struct timeval tvNow;
int ret = 0;
unsigned int nDelay = 0; /* usec */
fd_set rfds;
struct timeval tv;
int fd = 1;
int i = 0;
struct timespec req;
unsigned int delay[20] =
{ 500000, 100000, 50000, 10000, 1000, 900, 500, 100, 10, 1, 0 };
int nReduce = 0; /* 误差*/

#if 0
if (argc < 2)
{
PRINT_USEAGE;
exit (1);
}
nDelay = atoi (argv[1]);
#endif

fprintf (stderr, "%18s%12s%12s%12s/n", "function", "time(usec)", "realTime",
"reduce");
fprintf (stderr,
"-------------------------------------------------------------------/n");

for (i = 0; i < 20; i++)
{
if (delay[i] <= 0)
break;
nDelay = delay[i];

/* test usleep */
gettimeofday (&tvBegin, NULL);
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 %8u %8u %8d/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 %8u %8u %8d/n", nDelay,
nTimeTest, nReduce);
}

/* test select */
gettimeofday (&tvBegin, NULL);
FD_ZERO (&rfds);
FD_SET (fd, &rfds);
tv.tv_sec = 0;
tv.tv_usec = nDelay;
ret = select (0, 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 %8u %8u %8d/n", nDelay, nTimeTest,
nReduce);

}

return 0;
}

分享到:
评论

相关推荐

    usleep.exe

    提供跨平台的shell脚本中可调用的sleep功能,以便运维在跑脚本的时候可以中间让出CPU一会,或是等待其他任务优先完成

    PHP sleep()函数, usleep()函数

    主要介绍了PHP sleep()函数, usleep()函数,需要的朋友可以参考下

    NIOS延时函数使用 timestamp

    11 alt_timestamp_start(); // 开启时间戳服务 12 13 t0 = alt_timestamp();...14 usleep(1000); 15 t1 = alt_timestamp(); // 测量时间戳1 16 for(i=0; i; i++); 17 t2 = alt_timestamp(); // 测量时间戳1

    USleep.zip

    Pytorch版本实现的EEG网络结构以及对应在BCIV4a 上的测试效果!! 其中,main文件为网络结构,res.txt文件为网络模型在数据集上的效果!!

    NIOS II万年历

    #include "system.h" //包含基本的硬件描述信息 #include "altera_avalon_timer_regs.h" //定义内核寄存器的映射,提供对底层硬件的符号化访问 ...#include "unistd.h" //延时函数usleep #include "stdio.h

    实验四Linux中断与异常编程技术

    一个是用linux内部的三个定时器,另一个是用sleep, usleep函数让进程睡眠一段时间,使用alarm定时发出一个信号,还有那就是用gettimeofday, difftime等自己来计算时间间隔,然后时间到了就执行某一任务,但是这种...

    easy-sleep:通过带有N-API的CC ++插件将sleep(),usleep()添加到Node.js。 实现真正的事件循环阻止睡眠

    通过带有N-API的C / C ++插件将sleep(),usleep()添加到Node.js。 实现真正的事件循环阻止睡眠。 使用NPM安装 npm install easy-sleep -S 用法 异步睡眠 基于Promise + setTimeout组合的实现。 const { sleep ...

    智能软起动

    usleep(200000); //等待10个周波的时间,将缓冲区填满 CreateTimerMs(5,ProtectHandle,0x40); //创建保护定时器,采样缓存满10周波后才创建 lcdinit(); //放到前面可能导致不显示(必须的!!) //程序启动后要...

    程序假死解决方法 delphi 、c++

    程序假死 或者类似于陷入死循环 或进程占用满了 另一个进程无法实现 试试这个方法

    串口程序 自己编的 异步串口

    串口程序 自己编的 异步串口串口程序 自己编的 异步串口串口程序 自己编的 异步串口串口程序 自己编的 异步串口

    node-sleep:将sleep()和usleep()添加到node.js

    睡觉通过C ++绑定将 , msleep()和到Node.js。 这主要用于调试。 请注意,由于这是一个C ++模块,因此将需要在要使用它的系统上构建它。...} 如果您需要usleep则仍然需要此模块。用法var sleep = require('sleep');

    Linux多线程编程,替代sleep的几种方式

     1、usleep  这个是轻量级的,听说能可一实现线程休眠,我个人并不喜欢这种方式,所以我没有验证它的可行信(个人不推荐)。  2、select  这个可以,我也用过这种方式,它是在轮询。  3、pthread_cond...

    PHP函数.doc

    usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。 time_sleep_until() 函数延迟代码执行直到指定的时间。 time_...

    PHP5常用函数列表(分享)

    如下所示:复制代码 代码如下: usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。 time_sleep_until() 函数延迟...

    PHP5函数小全(分享)

    usleep() 函数延迟代码执行若干微秒。unpack() 函数从二进制字符串对数据进行解包。uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。time_sleep_until() 函数延迟代码执行直到指定的时间。time_nanosleep...

    GameOfFifteen:为 CS50 类用 C 编写的十五人游戏

    十五个游戏游戏的结构和说明由 Dabid J.Malan 提供... 用法:./十五从而板的尺寸是 dxd, 其中 d 必须在 [MIN,MAX] 请注意,usleep 已过时,但它提供的粒度比sleep 并且比 nanosleep 更易于使用; man usleep更多。 */

    toolchain_mARkclang:从最新的llvm-project clang 13编译

    适用于Android内核的工具链 -&gt;从最新的llvm-project clang 13编译并针对android aarm64 _____ _ _____ _ __ ____ /\ | __ \| | / ____| | /_ |___ \ _ __ ___ / \ | |__) | | _| | | | __ _ _ __ __ _ ______| ...

    0.6版ffmpeg.c在vs2005下编译

    6.linux下的函数usleep()精确到微秒,而VC的Sleep,sleep只能是秒,豪秒,这个差距不知道怎么解决.暂时我就让错差存在. 7.其实编的时候,里面很多include的头文件没用着的,我就注释了. 8.加上extern "C"{};规范 =========...

    常用PHP5函数小全

    usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。 time_sleep_until() 函数延迟代码执行直到指定的时间....

Global site tag (gtag.js) - Google Analytics