linux 下高精度时间
今天在公司代码中看到了使用select函数的超时功能作定时器的用法,便整理了如下几个Linux下的微秒级别的定时器。在我的Ubutu10.10 双核环境中,编译通过。
- /*
- * @FileName: test_sleep.c
- * @Author: wzj
- * @Brief:
- *
- *
- * @History:
- *
- * @Date: 2012年02月07日星期二22:20:00
- *
- */
- #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>
- #include<sys/select.h>
- int main(int argc, char **argv)
- {
- unsigned int nTimeTestSec = 0;
- unsigned int nTimeTest = 0;
- struct timeval tvBegin;
- struct timeval tvNow;
- int ret = 0;
- unsigned int nDelay = 0;
- 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; //误差
- fprintf(stderr, "%19s%12s%12s%12s\n", "fuction", "time(usec)", "realtime", "reduce");
- fprintf(stderr, "----------------------------------------------------\n");
- for (i = 0; i < 20; i++)
- {
- if (delay[i] <= 0)
- break;
- nDelay = delay[i];
- //test sleep
- gettimeofday(&tvBegin, NULL);
- ret = usleep(nDelay);
- if(ret == -1)
- {
- 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
- req.tv_sec = nDelay/1000000;
- req.tv_nsec = (nDelay%1000000) * 1000;
- gettimeofday(&tvBegin, NULL);
- ret = nanosleep(&req, NULL);
- if (-1 == ret)
- {
- fprintf (stderr, "\t nanousleep %8u not support\n", nDelay);
- }
- 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
- tv.tv_sec = 0;
- tv.tv_usec = nDelay;
- gettimeofday(&tvBegin, NULL);
- 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);
- //pselcet
- req.tv_sec = nDelay/1000000;
- req.tv_nsec = (nDelay%1000000) * 1000;
- gettimeofday(&tvBegin, NULL);
- ret = pselect(0, NULL, NULL, NULL, &req, NULL);
- 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 pselect %8u %8u %8d\n", nDelay, nTimeTest,nReduce);
- fprintf (stderr, "--------------------------------\n");
- }
- return 0;
- }
老大建议我们在对精度要求较高的情况下使用select()作为定时器,最大的好处就是不会影响信号处理,线程安全,而且精度能得到保证。在这个实验中,当时间延时时间较长时,select和pselect表现较差,当时间小于1毫秒时,他们的精确度便提高了,表现与usleep、nanosleep不相上下,有时精度甚至超过后者
linux 下高精度时间的更多相关文章
- Linux下长时间ping网络加时间戳并记录到文本
Linux下长时间ping网络加时间戳并记录到文本 由于一些原因,比如需要检查网络之间是否存在掉包等问题,会长时间去ping一个地址,由于会输出大量的信息而且最好要有时间戳,因此我们可以使用简单的 ...
- Linux下精确控制时间的函数
Linux下精确控制时间的函数 在测试程序接口运行时间的时候,常用time,gettimeofday等函数,但是这些函数在程序执行的时候是耗费时间的,如果仅仅测试时间还行,但是如果程序中用到时间控制类 ...
- Linux下设置时间
Linux下设置时间 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...
- Linux下系统时间函数、DST等相关问题总结(转)
Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...
- linux下的时间
1.linux下时间管理机制: 在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现.为了保持系统时间与CMOS时间的一致性,Linux每隔11分钟会 ...
- linux下修改时间和时区
一.修改linux的时间在root用户下,使用date指令:date -s1.只修改日期,不修改时间,输入: date -s -- 2.只修改时间,输入: date -s :: 3.同时修改日期时间, ...
- linux下的时间管理概述
2017/6/21 时间这一概念在生活中至关重要,而在操作系统中也同样重要,其在系统中的功能绝不仅仅是给用户提供时间这么简单,内核的许多机制都依赖于时间子系统.但凡是要在某个精确的时间执行某个事件,必 ...
- Linux下RTC时间的读写分析【转】
本文转载自:http://blog.csdn.net/little_walt/article/details/52880840 Linux系统下包含两个时间:系统时间和RTC时间. 系统时间:是由主芯 ...
- LINUX下的时间与时区的设置
在RHEL下,如果只装英文版系统,设置好时区以后(上海时间,UTC) 在命令行下用date命令查看,总是与实际的北京时间差8小时,其实硬件时间都是准确的.会带来视觉不便. 今天下决心解决此问题,不过也 ...
随机推荐
- 转 WebService两种发布协议--SOAP和REST的区别
转发文章 https://blog.csdn.net/zl834205311/article/details/62231545?ABstrategy=codes_snippets_optimize_v ...
- 手机web网页的设计
Viewport(视口) 1.视口概念 描述:视口,就是视图窗口的简称,页面中视口大小实际上就是html元素的显示大小 说明:页面想要在移动端加载必须进行视口适配 如果不对页面进行调整,默认页面在 ...
- Java--equals和 == 的比较和equals()、HashCode()的重写
一. equals和 == 的比较 1.== 运算符 ① == 如果比较的是基本数据类型,则比较的是值. ② == 如果比较的是引用数据类型,则比较的是地址值. 2.equals ①它属于java.l ...
- 201621123080《java程序设计》第14周实验总结
201621123080<java程序设计>第14周实验总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2. ...
- Linux下配置Django_Apache_Mysql环境(CentOS 7.5)
本文将介绍如何在Linux上部署Django + Mysql + Apache环境.我们知道,Django内置的http服务器只能工作在单线程下,做开发和调试时候是可以的,但是生产环境通常都会有多用户 ...
- poj 3190 奶牛挤奶问题 贪心算法
题意:奶牛挤奶问题,每只奶牛在[a,b]的时间内挤奶,要求挤奶的过程中不能不打扰,且只能自己一个人独享挤奶的机器.问最少需要多少个挤奶的机器? 思路: 对奶牛挤奶开始的时间从小到大开始排序. 将正在工 ...
- 【原创】关于高版本poi autoSizeColumn方法异常的情况
之前使用的3.9版本,autoSizeColumn方法一切正常,现在切换到了3.15版本这个方法就出先了问题,问题如下,无法自动追踪所有的列. Exception in thread "ma ...
- 15年多校第一场七题hdu5294
要做这题,先要明白图的割,说白了就是 为了让原点无法到汇点要删几条边(之所以叫割,就是在图面上切一刀,减掉最小的边是原点和汇点成为两个集合),想到了割先放着一会用. 题中说只有沿最短路走才有可能追上, ...
- MyString的简单实现
MyString.h 文件 #ifndef _STRING_H_ #define _STRING_H_ #include <iostream> using namespace std; c ...
- c#利用反射实现对类中的常量进行取值和对应常量的注释
C#利用反射实现对类中的常量进行取值和对应常量的注释 项目示例:https://gitee.com/dhclly/IceDog.GenerateErrorCode 因为业务需要,项目中有大量的错误码, ...