C++14系列(2):C/C++的时间函数
来源:互联网 发布:淘宝如何搜索苍蝇水 编辑:程序博客网 时间:2024/06/06 18:44
C++笔记开始
为了好好研究下C++14,顺便复习下以前的C++知识。搞了个git(不断完善中):
https://github.com/rododo/cpp14examples.git
里面会慢慢封装一些常用的函数,并做一些测试验证,工程是建立在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++的时间函数
- C 的时间函数
- C的时间函数
- 几个时间的C函数
- C时间函数的应用
- C语言的时间函数
- C语言的时间函数
- C时间函数集
- C时间处理函数
- C时间函数集
- c时间函数
- C语言时间函数
- C时间函数概述
- C时间函数
- c/c++时间函数
- C/C++时间函数
- C/C++时间函数
- c 时间函数
- android开发(23)使用DownloadManager下载文件
- android开发(24)使用SQLiteOpenHelper的onUpgrade实现数据库版本升级
- 程序员面试必备锦囊,懂了这些工资轻松过万
- 用WebBrowser承载视图,html编写页面,c#编写后端代码;用js调用后端代码,传入function参数作为回调;
- android targetSdkVersion详解
- C++14系列(2):C/C++的时间函数
- .net 4中使用 dynamic,将json字符串转成对象的 万能方法。
- iOS 地图移动中心点获取
- 下载文件
- string 和 vector 初探
- 使用HTTP POST请求12306网站接口查询火车车次API
- HDU 5294 Tricks Device 残余网络(最短路+最大流)**
- .net 4中使用 dynamic,将json字符串转成对象的 万能方法。
- easyui combobx 的使用