• C++14系列(2):C/C++的时间函数


    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.
    ",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

    当中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.
    ", 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函数得到的。它们也能够用于日期的显示。

  • 相关阅读:
    内容居中
    ajax验证登录注册
    html5 图片转为base64格式异步上传
    关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条
    oracle数据库操作(未封装)
    oracle数据库操作(结合读取.ini文件操作)
    读取xml文件的方法
    线程练习
    TypeError: the JSON object must be str, not 'bytes'报错问题解决
    python datetime.datetime is not JSON serializable 报错问题解决
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7295221.html
Copyright © 2020-2023  润新知