C++笔记開始

为了好好研究下C++14。顺便复习下曾经的C++知识。搞了个git(不断完好中):

https://github.com/rododo/cpp14examples.git

里面会慢慢封装一些经常使用的函数。并做一些測试验证。project是建立在Ubuntu的Eclipse之上,见系列(1)环境搭建。

经常使用的时间函数

參考:

http://blog.chinaunix.net/uid-24517893-id-363870.html

时间函数经常使用到的几个概念:Calendar Time(日历时间)。epoch(时间点),clock tick(时钟计时单元)Coordinated Universal Time(UTC):世界标准时间,即格林威治标准时间(Greenwich Mean Time,GMT)。

epoch:时间点。

在标准C/C++中是一个整数,它用当前的时间和标准时间点的相差秒数来表示。它能够理解成日历时间,由于它已经是一个差值了。

日历时间(Calendar Time),是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。

clock tick:时钟计时单元。一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期。而是C/C++的一个基本计时单位。

进程的CPU使用时间计时

C/C++中的cpu使用计时函数是clock(),而与其相关的数据类型是clock_t。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。当中clock_t是用来保存时间的数据类型。

clock_t是一个长整形数。在time.h文件里,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,例如以下打印的是进程执行至今占用的cpu时间秒数。而且它是算单核的秒数,假设这个程序是多线程的。core1和core2同一时候被某程序的两个线程使用了5s的cpu执行时间片。那么此时打印的应该是10s(已经验证)。

printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);

日历时间

在C/C++中通过 < time.h > 里的time函数获得日历时间。日历时间(Calendar Time)是通过time_t数据类型来表示的。用time_t表示的时间(日历时间)是从一个时间点(比如:1970年1月1日0时0分0秒)到此时的秒数。time_t实际上是长整型。

用time()函数结合其它函数(如:localtime、gmtime、asctime、ctime)能够获得当前系统时间或是标准时间。

time_t time(time_t * timer);

日历时间(秒)与日期(年月日)关系

在标准C/C++中。我们可通过tm结构来获得日期。tm结构在time.h中有定义,相当于一个包括了年月日小时分钟等的结构体。

ANSI C标准称使用tm结构的这样的时间表示为分解时间(broken-down time)。

而日历时间(Calendar Time)是从一个时间点到此时的秒数,类型比較简单。

在time.h头文件里,我们还能够看到一些函数,它们都是以time_t为參数类型或返回值类型的函数:

double difftime(time_t time1, time_t time0);
time_t mktime(struct tm * timeptr);
time_t time(time_t * timer);
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

此外。time.h还提供了两种不同的函数将日历时间(一个用time_t表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式tm:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

固定的日期格式打印

使用函数:

char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

打印结果:

比如 Wed Jan 02 02:03:55 1980\n\0

当中asctime()函数是通过tm结构来生成字符串。所以能够传给世界时间或者本地时间,而ctime()是通过日历时间来生成字符串。ctime()函数须要先參照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串。所以一般其打印的是本地时间字符串。

自己定义的日期格式打印

使用strftime()函数将时间格式化为想要的格式。它的原型例如以下:

size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);

样例:

strftime(str,100,"It is now %I %p",ptr);
printf(str);

其执行结果为:

It is now 4PM

样例:

strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
printf(tmpbuf);

执行结果:

Today is Saturday, day 30 of July in the year 2005.

分解时间转化为日历时间

分解时间,在C/C++中指tm结构。我们能够使用mktime()函数将tm结构转化为日历时间。其函数原型例如以下:

time_t mktime(struct tm * timeptr);

< sys/time.h >的计时函数

除了上述的标准C/C++用到的时间函数外,Linux系统也提供了一个函数。能够精确到微秒。

这就是gettimeofday函数,它获得的时间精确到微秒(1e-6 s)量级。

在一段代码前后分别使用例如以下:

struct timeval tv_begin, tv_end;
gettimeofday(&tv_begin, NULL);
foo();
gettimeofday(&tv_end, NULL);

结构体timeval的定义为:

struct timeval{
long int tv_sec; // 秒数
long int tv_usec; // 微秒数
}

time仅仅能返回秒级的返回值。而该结构体能精确到微秒级。

该函数和time函数一样都是按真实世界的时间来计算的。

总结

本文介绍了C/C++中的有关日期和时间的概念,并通过各种实例讲述了这些函数和数据结构的用法。

假设要測试优化的程序的执行效率,一般測量进程在cpu上使用的时间片之和,能够用clock函数,clock函数并不代表真实世界的时间。

真实世界的时间则是time或者gettimeofday函数得到的。它们也能够用于日期的显示。

C++14系列(2):C/C++的时间函数的更多相关文章

  1. MySQL 笔记 —— 日期和时间函数

    [TOC] 获取当前日期的函数和获取当前时间的函数 CURDATE()和CURRENT_DATE()函数获取当前日期:CURTIME()和CURRENT_TIME()函数获取当前时间. mysql&g ...

  2. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)

    DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...

  3. 玩转Windows服务系列——Windows服务启动超时时间

    最近有客户反映,机房出现断电情况,服务器的系统重新启动后,数据库服务自启动失败.第一次遇到这种情况,为了查看是不是断电情况导致数据库文件损坏,从客户的服务器拿到数据库的日志,进行分析. 数据库工作机制 ...

  4. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

    跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...

  5. impala系列: 时间函数

    --=======================时间函数--======================= --当前时间戳now()current_timestamp() --当前时间戳相对于 li ...

  6. web报表工具FineReport常用函数的用法总结(日期和时间函数)

    web报表工具FineReport常用函数的用法总结(日期和时间函数) 说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd.而且必须用英文环境下双引号(" " ...

  7. web报表工具FineReport经常使用函数的使用方法总结(日期和时间函数)

    web报表工具FineReport经常使用函数的使用方法总结(日期和时间函数) 说明:凡函数中以日期作为參数因子的,当中日期的形式都必须是yy/mm/dd.并且必须用英文环境下双引號(" & ...

  8. Loadrunner时间函数、用时间生成订单编号例子

    Loadrunner中取时间函数.用时间函数生成订单编号例子: <如要转载,请注明网络来源及作者:Cheers_Lee> 问题的提出: (1)有时候在Loadrunner中用C语言设计脚本 ...

  9. MySQL数据库9 - 日期与时间函数

    一 日期和时间函数 函数的概念:按指定格式输入参数,返回正确结果的运算单元 1. 返回当前日期:curdate() current_date() current_date()+0可以将当前日期转换为数 ...

随机推荐

  1. [Android 源码] Android源码下载

    Android源码下载 为了能够顺利的下载Android的源码,同时也为了避免在网络上再次搜寻如何下载源码的麻烦,我把下载过程记录在这篇文档中. 官网中也有详细的介绍: http://source.a ...

  2. 2 cocos2dx 3.0 源码分析-Director

    Director 导演类, 这个类在整个引擎中担当着最重要的角色, 先看看它是如何初始化的,它共管理了哪些内容呢?    1初始化- 更新处理Scheduler   Scheduler 这个类负责用户 ...

  3. Windows之权限讲解

    windows中,权限指的是不同账户对文件,文件夹,注册表等的访问能力.在windows中,为不同的账户设置权限很重要,可以防止重要文件被其他人所修改,使系统崩溃. 1权限概念 我们可以在控制面板中设 ...

  4. 登入爱丽网后台(非JS绕过、非盲打、非IP欺骗)

    后台: http://wed.27.cn/marry/marryadmin/web/login.php 不难猜解到后台管理的相关页面名称(不存在的页面服务器返回404,而存在的页面会直接跳转到上面的登 ...

  5. 为什么Domain controller上的time synchronization非常重要?

    虚拟机默认情况下所拥有的资源都是不同的, 比如说CPU clock. 在一个忙碌的系统中, 虚拟机甚至可能在很短的一段时间内被拒绝分配资源给它, 这种情况还可能发生在高系统负荷, VMotion, B ...

  6. Tensorflow 深度学习简介(自用)

    一些废话,也可能不是废话.可能对,也可能不对. 机器学习的定义:如果一个程序可以在任务T上,随着经验E的增加,效果P也可以随之增加,则称这个程序可以在经验中学习. “程序”指的是需要用到的机器学习算法 ...

  7. tomcat生产部署关键參数设置

    JVM设置 个节点.每一个tomcat估计处理500个链接,那么连接池的长连接数最大设为2000. 全节点复制(DeltaManager)模式集群节点数3-6为宜. 主备复制(BackupMnagag ...

  8. ssh-keygen配置

    1) 在本地机器中的~/.ssh/目录下执行下命令, ssh-keygen -t dsa 将生成两个文件,id_dsa和id_dsa.pub. 2) 将id_dsa.pub拷贝到远程机器,并且将id_ ...

  9. C++基础学习教程(五)

    这一讲我们集中解说类和他的一些特性.首先我们从自己定义一个有理数类来開始. 在C语言中有一个keyword: struct ,用来创建一个结构体类型.可是在C++中这个关键的含义就不只如此了,以下我们 ...

  10. 机器学习实战之PCA

    1.  向量及其基变换 1.1 向量内积 (1)两个维数同样的向量的内积定义例如以下: 内积运算将两个向量映射为一个实数. (2) 内积的几何意义 如果A\B是两个n维向量, n维向量能够等价表示为n ...