程序中时间的表示及时间函数的的选择

C++11-chrono时间库解析 chrono用法 阅读详情

时间系统一般在程序中有以下几个层次:

1. 绝对时间

2. 本机系统时间

3. 本进程运行时间

4. 用户自定义的时间(差分系统时间)


根据不同的精度需求一般又分为:

1. 日历时间

2. 高精度时间


根据场景不同,又可分为:

1. 单系统,单线程

2. 单系统,多线程(多进程)

3. 跨系统,多线程(多进程)


linux系统与windows系统又略有不同,这里总结下最近对时间系统的理解。


日历时间,往往以年,月,日,时,分,秒的格式出现,这是对精度要求不高的时间需求。


在windows API中,获取时间的函数:

CTime::GetCurrentTime();

GetLocalTime(&st);


linux下,用time_t数据类型来保存,是自1970年1月1日00:00:00以来国际标准时间所经过的描述累计值。

time_t 一般是一个long型来表示,单位是秒

而struct tm是一个结果 以年,月,日,时,分,秒等表示

相关函数: ctime()、gmtime()、localtime()、asctime()、mktime()、strfitme()

一些函数是time_t与结构tm直接的相互转换:

localtime和gmtime都是将日历时间转换为年月日时分秒表示的时间,并存入struct tm的结构中,两个区别:前者考虑转换成本地时间,考虑了市区和夏时制标志;后者则转换为国际的标准时间。

mktime则是将struct tm转换为time_t,将结构转换为秒数

ctime和astime则是将时间转换为时间字符串,区别是两者的入参一个是time_t,另一个是struct tm

time(time_t)是获取秒数。


 且以上函数是单线程下使用,不是多线程安全的,若在多线程下,应使用:

       char *asctime_r(const struct tm *tm, char *buf);
       char *ctime_r(const time_t *timep, char *buf);
       struct tm *gmtime_r(const time_t *timep, struct tm *result);
       struct tm *localtime_r(const time_t *timep, struct tm *result);
以上仅仅是与日历时间相关,精度是秒。


但在实时系统中,很多事需要高精度时间的比较:

所以,需要其他函数的支持:

windows下:

getTickCount      10ms精度,其实是tick的精度,如果tick的精度是22ms,那么这个函数的精度是22ms。很多毫秒标称的函数,其精度都是粗于1毫秒的。

QueryPerfermanceCount / QueryPerformanceFrequency  约100ns精度  



而linux下,提供了两个结构来描述,一个微秒级,一个纳秒级

struct timeval

{

time_t tv_sec;

suseconds_t tv_usec;

};

对应的函数gettimeofday

struct timespec

{

time_t tv_sec;

long tv_nsec;

};

对应的函数是 clock_gettime()

这两个函数都是可重入的,即线程安全的。


在程序要求统计精确的时间时,常用的是clock()函数。

其通常是统计单进程的运行时间。但其精度要粗于ms。并且,其无法统计子进程的时间,linux下无法,区分用户空间和进程空间。


而times函数/系统调用,能区分进程、子进程的用户代码和内核代码的执行时间。其返回的结构是struct tms;

但clock和times函数的精度一般为10ms,或更糟。


1. 绝对时间获取

使用场景:跨机系统,多线程开发

在linux系统中,是自1970年1月1日00:00:00以来国际标准时间所经过的描述累计值,使用这个很方便。timespec或timeval结构能比较方便的提供高精度的时钟。

而在windows下,GetTimeTick(),及QueryPerformanceCounter()都是从本机系统启动开始统计。因此,其需要外部时间服务器来支持。


2. 本机系统时间systemTick

使用场景:本机系统,多线程或单线程开发

Linux和Windows都能支持这种方式。


3. 本线程运行时间

使用场景:clock()函数。在简单的单线程开发中使用。


4. 用户自定义的时间

使用场景:较复杂的系统,拥有自定义时间服务的类库

a. 提供统一的时间戳接口。可以分别封装linux和windows的时间函数。

b. 差分时钟服务。更进一步的封装,提供一个timer类,当实例化的timer类 start时,记录下当前的绝对时间或系统时间startTime,以后每次从timer获取时间时,只需要提供一个时间差,(currentTime - startTime)。这样就能简化时间的表示形式,只需一个整型数表示时间,不用担心溢出的问题。这在日志等服务里使用比较好。


最后,时间的表示问题:

当用一个整型数来表示时间的秒数或毫秒数时,很容易造成溢出。有三种方法处理:

1. 采用64位计数器。Int64,如果当前硬件/系统支持,就采用64位表示,只不过其开销大些,但编程使用时比较方便。

2. 采用分段式计数,如timeval,timespec,一个统计秒数,另外一个统计us或ns。在linux系统下,比较方便。

3. 采用相对系统启动时间。


无论哪种方式,根据实际需求,要注意time时间的表示方式在当前程序中是否会溢出。如果可能溢出,就要挑选一种稳妥的方式来表示。


参考:

http://www.cnblogs.com/nanye/articles/2532480.html

http://www.360doc.com/content/12/1227/19/9305922_256634687.shtml

http://blog.youkuaiyun.com/tanker1024/article/details/3889308

Python获取当前时间写法 然后使用strftime()方法将当前时间格式化为"%Y-%m-%d %H:%M:%S"的字符串形式,并将格式化后的时间存储在formatted_time变量中。time模块是Python内置的一个用于操作时间的模块,其中的time()函数可以返回当前时间的时间戳,即从1970年1月1日午夜(UTC)开始到当前时间的秒数。Python提供了多种方法来获取当前时间,下面将介绍其中常用的几种方法。上述代码中,我们通过调用time()函数获取到当前时间的时间戳,并将其存储在current_time变量中。 阅读详情

相关推荐

在Qt中打造自定义时间选择组件

自定义UI组件是软件开发中的一个重要方面,它允许开发者创建满足特定需求的用户界面元素。通过自定义控件,开发者可以增强应用程序的用户体验,使界面更加直观和易于使用。自定义控件的优势在于能够提供一致的视觉风格、交互模式和符合设计规范的界面元素,从而提升软件的整体品质和可维护性。关键优势包括:一致性:自定义控件可以在整个应用程序中保持一致的外观和操作,提供统一的用户体验。灵活性:开发者可以根据具体需求定制组件的功能和外观,不受标准控件功能的限制。

weixin_28681379的博客 929

Linux下 C语言统计时间差

前言 主要是为了统计下某段程序的运行时间 代码实现 主要调用了linux c下的<sys/time.h> #include<stdio.h> #include<sys/time.h> double tick(void) { struct timeval t; gettimeofday(&t, 0); return ...

楼上小宇_home 8801

掌握Excel-VBA宏编程:使用Switch函数显示当前时间

Switch函数是VBA中一个非常实用的功能,它能够帮助开发者在程序中做出多条件判断。这个函数可以接受多个参数,每一个参数都是一个表达式,Switch函数会从左到右依次计算这些表达式,返回第一个计算结果为True的表达式对应的值。如果所有的表达式结果都是False,则返回Nothing或指定的默认值。要使用Switch函数,首先需要明确你的判断条件和每个条件对应的返回值。然后,按照以下语法在VBA中实现:在这里,condition1condition2, ... 是条件表达式,而。

weixin_42515340的博客 1180

时间对于程序员的价值,以及如何高效地利用时间,同时划分下勤奋度的等级...

    本文不讲“时间就是生命”之类的套话,而是会量化地直观地描述时间对程序员的价值。在高效利用时间的方法方面,也不会讲“合理制定计划,然后再执行”之类的对每类人都适用的方法,而会专门讲述针对程序员的时间管理方案。 1  对初级Java开发而言,学习能带来的其实收益不多,但必须得学     一般而言,本科有1年经验,可以算得上初级开发,再做个2到3年,一般就能达到高级开发的工作年限要求,但是!...

weixin_34393428的博客 242

uniapp实现app版本发现新版本后,自动更新

app实现自动更新

oldolder的博客 1283

WSL2+Docker实战:在Windows上部署MinerU 2.5.3,解锁媲美Demo的VLM PDF解析能力

本文详细介绍了如何在Windows系统上通过WSL2+Docker部署MinerU 2.5.3,实现媲美Demo的VLM PDF解析能力。文章涵盖环境准备、Docker部署实战技巧及高级使用技巧,特别针对PDF识别中的复杂排版、公式和图表处理提供了优化方案,帮助用户高效处理学术论文和技术文档。

weixin_29291573的博客 482

c语言表示时间的程序,C语言显示“当前时间”小程序

今天 闲着没事,写了一个C语言显示“当前时间”的小程序。该小程序用到了头文件:time.h是日期和时间的头文件(C语言和C++)时间方式:​time_t time(time_t* timer) 得到从标准计时点(一般是1970年1月1日午夜)到当前时间的秒数。clock_t clock(void) 得到从程序启动到此次函数调用时累计的毫秒数。函数名称:localtime函数原型: struct t...

weixin_29945371的博客 3504

通达信浮筹多空波段抓牛擒龙指标公式源码

VAR33:=VA3>=REF(VA4,1) AND C<REF(C,1) AND VAR19=60 AND VAR18=0 AND 活跃线>=REF(活跃线,1) AND VA12<REF(VA13,1);DRAWTEXT(VAR28 AND COUNT(VAR28,30)=1,65,' ★超涨注意风险'),COLOR0000FF;DRAWTEXT(VAR26 AND COUNT(VAR26,30)=1,90,' ←继续等'),COLOR00FFFF;浮筹线:VA3,COLORFF00FF;

2401_86043146的博客 5262

C 语言 时间函数使用技巧(汇总)

C 语言 时间函数 使用技巧(汇总)

伍悦匿匿 3011

别再到处找资源了!WinCC 7.5 SP2官方下载与Windows 10保姆级安装避坑指南

本文提供了WinCC 7.5 SP2在Windows 10上的官方下载与安装全流程指南,重点解决了资源获取难、系统兼容性问题及分卷压缩处理等常见痛点。通过详细的步骤和实用技巧,帮助用户顺利完成安装并优化配置,适用于工控领域的学习者和从业者。

weixin_32924297的博客 480

植物GO注释

本文主要是对没有GO term库的植物进行注释。 1、选用AgriGo 进行注释,在agriGO中点击species后,查看与你目标物种相近的物种作为库 2、比如我以甜菜为例 为了找到和GO term对应的ID,先找到PLAZA,进入网站https://bioinformatics.psb.ugent.be/plaza/versions/plaza_v3_di...

weixin_30300225的博客 2226

C/C++中的日期和时间

C/C++中的日期和时间撰文/周翔摘要:本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单

6103

11种图像清晰度评价函数附MATLAB代码

博主的第一篇博客! 本科毕业论文是“基于图像处理的自动对焦技术研究”,对焦过程中的一个重要阶段是图像清晰度评价,博主自己用MATLAB实现了4类清晰度评价函数:基于图像梯度的清晰度评价函数、频域评价函数、信息熵评价函数、统计学评价函数,总计11种。博主之前没有用过MATLAB,完全是本科论文需要,没办法对着别人的代...

kungfu_rabbit的博客 5万+

Java批处理调度_批处理系统的作业调度java.doc

批处理系统的作业调度java实验 批处理系统的作业调度实验目的加深对作业概念的理解;深入了解批处理系统如何组织作业、管理作业和调度作业。预备知识.实验内容编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。实验具体包括:首先确定作业块的内容和组成方式;然后完成作业调度;最后编写主函数,对所做工作进行测试。import java.util.Scanner;public clas...

weixin_39917211的博客 405

059、RealBasicVSR 实战:真实场景视频超分的退化建模与优化技巧

本文分享了RealBasicVSR在真实场景视频超分中的实战经验。针对传统方法假设理想化下采样导致的性能瓶颈,重点阐述了三个关键技术点:1)通过可学习退化编码器建模复杂未知退化过程,避免手动设计退化参数的局限;2)采用双向传播和DCN对齐增强时序一致性;3)组合多种损失函数并优化训练策略(如余弦退火学习率、随机退化增强)。作者结合项目实践指出了显存管理、训练时长、评估指标等常见问题,并给出实用建议:优先验证数据退化复杂度,重视数据预处理,合理调整超参数。文章强调真实场景视频超分的核心在于让模型自适应未知退化

ai技术增长的博客 180

基于SVD矩阵分解的用户购物篮预测分析实战

基于SVD矩阵分解的用户购物篮预测分析实战

360

matlab如何表示连乘运算,实验二连续时间信号在MATLAB中的表示和运算

实验二连续时间信号在MATLAB中的表示和运算[实验目的]1.掌握连续时间信号在MATLAB中的表示法。2.掌握信号的时域运算和变换。3.进一步掌握部分绘图函数的应用。[实验原理]在MATLAB中通常用两种方法来表示信号,一种是向量来表示信号,另一种则是用符号运算的方法来表示信号。一. 向量表示法MATLAB的信号处理工具箱有大量的函数可用于产生信号,这些函数中大部分都要求样间隔的时间值矢量t,是...

weixin_42298064的博客 968

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux 时间函数总结

首先了解关于时间的一些概念: UTC:协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT,本地时间是基于其的差值 本地时间:本地时间是utc时间和本地时区的差值 日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来 说,这个标准时间点是不变的,该编译

xiaoaide01的专栏 995

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++宏和函数的选择

有些编程任务既可以用带参数的宏完成,也可以用函数完成。应该使用宏还是函数?这没有硬性规定,但是可以参考下面的情况。

Shujie 243

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

windows时间函数大全

windows时间函数大全 - 浪迹天涯 - C++博客[ http://www.cppblog.com/qiujian5628/archive/2008/01/29/42113.html ] ... windows时间函数大全 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如

sunnysheng的专栏 761

一个算法对于某个输入的循环次数是可以事先估计出来的_算法时间复杂度分析:大O表示法

在开发的时候,我们如何评估一个算法的好坏,如何描述一个算法运行效率的高低呢?通俗一点的表达方法就是程序执行快或慢,但是这只是一种较为宽泛的描述,我们如何直观科学的用的描述它呢?有同学可能会说,用其运行时间不就可以很好很直观的描述它了。不过,不同的语言,不同的编译器,不同的CPU来说,对程序的处理的时间是不同的,我们无法单单用运行时间来描述某个算法执行效率。另外,当需要处理的数据增长时,算法的基本操...

weixin_39774490的博客 408

C++函数指针详解

详细讲解函数指针的作用,声明,赋值,使用,附有代码。

猫ER 5301

程序的运行时间

我们现在要给出某个函数是另一个函数的“大O”的正式定义。设有函数T (n ) ,这通常是某个程序的运行时间,以输入大小为n的函数来度量。要让函数适用于度量程序的运行时间,我们假设有:(1) 参数n被限定为非负整数;(2) 值T (n ) 对所有的参数n来说都非负。设 f (n ) 是某个定义在非负整数n之上的函数。如果除了对某些较小的n值之外,T ( n) 至多是某个常数乘以 f (n ),我们就可以说“T ( n) 是 O(f(n))”。

qq_47804149的博客 1367

Windows时间函数大全

  介绍       我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,

jianxiong8814的专栏 966

windows时间函数

介绍        我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编

C++ for Windows 之路 891
上一篇: 学习SIFT算法过程中的释疑
下一篇: 制定开发目录结构
viewcode
博客等级 码龄16年 993粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值