Linux获取纳秒级时间,WINDOW和LINXU下获取纳秒级时间精度
WINDOWS下的实现
这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。
当然,首先要弄清楚FILETIME与SYSTEMTIME定义。
typedef struct_FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
typedef struct_SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
比较一下,很明显,FILETIME与time_t类似,是64位整型,不过FILETIME是以100纳秒(ns)为单位。SYSTEMTIME与tm类似,不过多了一项wMilliseconds。可以看出,SDK时间比CRT的时间提供了更高的精度。同时SDK提供了更丰富的函数来处理时间。
void GetSystemTime(LPSYSTEMTIME lpSystemTime);
voidGetLocalTime(LPSYSTEMTIME lpSystemTime);
这两个函数获得SYSTEMTIME形式的当前时间,不过GetSystemTime函数获得当前的UTC时间,GetLocalTime获得当前的本地时间,可以想象,获得的两个时间存在着时差。类似于CRT中提供tm与time_t之间的转换,SDK也提供了两个函数来转换SYSTEMTIME时间与FILETIME时间。
BOOL SystemTimeToFileTime(constSYSTEMTIME* lpSystemTime,LPFILETIME lpFileTime);
BOOL FileTimeToSystemTime(constFILETIME* lpFileTime,LPSYSTEMTIME lpSystemTime);
//函数命名很self-explanatory,就不用多说了吧。SDK还提供了两个很有趣的函数。
BOOL LocalFileTimeToFileTime(constFILETIME* lpLocalFileTime,LPFILETIME lpFileTime);
BOOL FileTimeToLocalFileTime(constFILETIME* lpFileTime,LPFILETIME lpLocalFileTime);
LocalFileTimeToFileTime函数将本地的FILETIME时间转换为对应的UTC的FILETIME时间。我觉得,这个函数只是通过将本地时间减去与UTC时间的时间差来实现转换,比如在东八区的本地时间转换为对应的UTC时间,只需要将本地时间减去8*60*60*1000*1000*10(单位100ns)。类似,FileTimeToLocalFileTime函数是将UTC时间转换为本地时间,它只是将减去时间差换成加上时间差。
int main()
{
SYSTEMTIME stLocal, stUTC, stUTC2;
FILETIME ftLocal, ftUTC, ft;
ULARGE_INTEGER uli;
GetLocalTime(&stLocal);
GetSystemTime(&stUTC);
printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,
stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
printf("UTC System Time (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,
stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);
SystemTimeToFileTime(&stLocal, &ftLocal);
uli.LowPart = ftLocal.dwLowDateTime;
uli.HighPart = ftLocal.dwHighDateTime;
printf("Local File Time: %llu/n", uli.QuadPart);
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
uli.LowPart = ftUTC.dwLowDateTime;
uli.HighPart = ftUTC.dwHighDateTime;
printf("UTC File Time: %llu/n", uli.QuadPart);
FileTimeToSystemTime(&ftUTC, &stUTC2);
printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,
stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);
return EXIT_SUCCESS;
}
代码13行GetLocalTime函数获得当前的本地SYSTEMTIME时间,14行获得对应的UTC的SYSTEMTIME时间,如输出结果前两行所显示,两者相差8小时。
20行SystemTimeToFileTime函数将本地SYSTEMTIME时间转换为方便计算的本地FILETIME形式时间,如输出结果第三行所显示。
25行LocalFileTimeToFileTime函数将本地FileTime时间转换为对应的UTC的FILETIME时间,如输出结果第四行所显示。就像前面介绍的,如果你将输出结果第三,四两行所显示的数字相减,并除以10*1000*1000*60*60,你将会得出8,你可以算下试试,记住FILETIME是以100纳秒为单位的。
最后30行FileTimeToSystemTime将FILETIME时间转换为SYSTEMTIME时间。可以看出输出结果中第五行与第二行相同,这是必须的,因为两者都是当前本地时间对应的UTC时间。
LINUX下的实现
int clock_gettime(clockid_t clk_id, struct timespect *tp);
clockid_t clk_id用于指定计时时钟的类型,对于我们Programmr以下三种比较常用:
CLOCK_REALTIME, a system-wide realtime clock.
CLOCK_PROCESS_CPUTIME_ID, high-resolution timer provided by the CPU for each process.
CLOCK_THREAD_CPUTIME_ID, high-resolution timer provided by the CPU for each of the threads.
struct timespect *tp用来存储当前的时间,其结构如下:
structtimespec {
time_t tv_sec; /* seconds */
longtv_nsec; /* nanoseconds */
};
下面是示例:
#include // for printf()
#include // for gettimeofday()
#include // for sleep()
usingnamespace std;
timespec diff(timespec start, timespec end);
int main()
{
timespec time1, time2;
inttemp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for(inti = 0; i < 242000000; i++)
temp += temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout <
return 0;
}
timespec diff(timespec start, timespec end)
{
timespec temp;
if((end.tv_nsec - start.tv_nsec) < 0)
{
temp.tv_sec = end.tv_sec - start.tv_sec - 1;
temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
}
else
{
temp.tv_sec = end.tv_sec - start.tv_sec;
temp.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return temp;
}
在LINUX中可以使用函数gettimeofday()函数来得到时间。它的精度可以达到微妙
2.函数原型:
int gettimeofday(struct timeval*tv,struct timezone *tz )
3.说明:
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
4.结构体:
1).
struct timeval{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
2).timezone 结构定义为:
struct timezone{
int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
int tz_dsttime;/*type of DST correction*/
}
3).在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。
4).函数执行成功后返回0,失败后返回-1,错误代码存于errno中。
#include // for printf()
#include // for gettimeofday()
#include // for sleep()
int delay(inttime)
{
inti, j;
for(i = 0; i < 5000; i++)
for(j = 0; j < 5000; j++)
;
}
int main()
{
structtimeval start;
structtimeval end;
unsignedlongdiff;
gettimeofday(&start, NULL);
delay(10);
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
printf(“thedifference is % ld\n”, diff);
return 0;
}
Linux获取纳秒级时间,WINDOW和LINXU下获取纳秒级时间精度相关推荐
- 特权级转移 之 保护模式下数据段特权级保护依据
提炼: 1 对于数据段 ,处理器进行特权级检查的时机 就是为段寄存器赋值的那一个时刻 在保护模式下 当处理器对段寄存器进行赋值的时候,处理器就会使用规则进行特权级的检查.如: mov ax, Data ...
- linux mysql 系统时间函数吗_linux下获取系统时间的方法
可以用 localtime 函数分别获取年月日时分秒的数值. Linux下获得系统时间的C语言的实现方法: 1. 可以用 localtime 函数分别获取年月日时分秒的数值. #include ...
- c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
- qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...
获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...
- android fps 获取,Android下获取FPS的几种方法
FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...
- linux ps le hrtime,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度
视频讲解 文字讲解 如果去测试代码运行的时长,你会选择哪个时间函数? 一般第一时间想到的函数是 Date.now 或 Date.getTime. 1.先讲结论 之所以这么选,是基于 精度 和 时钟同步 ...
- linux ns级定时器_linux用户空间获得ns纳秒级时间示例
一.引言 我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能,下面介绍下linux中用户空间获得ns级时间的方法 二.用户空间获得ns级时间 使用clock_gettime函数 ...
- c语言编程获取当前系统时间包含年,月,日,时,分,秒.,C语言获取系统时间的几种方式...
核心提示:C语言中如何获取时间?精度如何?1使用time_ttime(time_t*timer)精确到秒2使用clock_tclock()得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3计 ...
- Linux下获取毫秒级时间差
Linux下获取毫秒级时间差 使用Linux的gettimeofday函数可以达到这个目的 其中t1=t_start.tv_sec是公元1970年至今的时间(换算为秒) t2=t_start.tv ...
最新文章
- 数据库原理与设计 P75作业 学号2013211466 班级0401302
- PyCharm中目录directory与包package的区别
- VTK:Texture之TextureCutSphere
- java登录中用户类型分类_基于用户登陆的struts2中action的分类详解
- JavaScript--获取页面盒子中鼠标相对于盒子上、左边框的坐标
- 跨站请求伪造(CSRF/XSRF)
- break在matlab中的用法,求助这个算法运行的时候说错误: BREAK只能在FOR或WHile使用...
- minwindow java_java中setMinWindowLayout()是什么呀?
- 《移动App测试的22条军规》—App测试综合案例分析23.4节测试微信App的手势操作...
- andorid平台游戏内存修改器的开发思路
- oracle分布式事物锁,ORA-02049:超时:分布式事务处理等待锁诊断-Oracle
- linux分享二:Linux如何修改字符集
- C++ Primer Plus学习(十二)——类继承(is-a)
- yolov2 损失函数_目标检测算法之YOLOv2损失函数详解
- java cropper 上传_基于cropper.js的图片上传和裁剪
- 值得收藏的JavaScript代码
- 广联达报错access_广联达软件报错问题汇总和解决方案.doc
- 华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】
- android ota权限,Android手机Root后不能接收OTA?
- 继电器学习笔记(一)——继电器的分类电磁继电器和磁保持继电器的工作原理
热门文章
- 面试官:为啥需要枚举?枚举有什么作用?怎么用枚举实现单例?
- 初识爬虫,爬虫原理?爬虫是什么?为什么爬虫用python比较流行?
- numeric scale mysql_MySQL基础教程1 — 数据类型之数值类型 - numeric
- 可扩展标记语言XML(淅淅沥沥的小雨)
- COGS 2211. [BZOJ3653]谈笑风生
- HDFS开启HA后,Hbase的REGIONSERVERS启动错误(Operation category READ is not supported in state standby)
- 路由器修改wifi密码
- 从现在开始,格外珍惜时间,让生活充实起来
- 流体力学发展史(转)
- 中文分词与去除停用词