龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

详细介绍C/C++时间函数使用方法(1)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
下面详细介绍C/C++中的时间函数,供大家参考。 1. 时间的定义 C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取

下面详细介绍C/C++中的时间函数,供大家参考。

1. 时间的定义

C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法。

通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:

Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8.美国是UTC-5.

Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。

epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。

2. 计时

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下:

  1. clock_t clock( void ); 

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

  1. #ifndef _CLOCK_T_DEFINED  
  2. typedef long clock_t;  
  3. #define _CLOCK_T_DEFINED  
  4. #endif 

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

  1. #define CLOCKS_PER_SEC ((clock_t)1000) 

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1.下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

  1. void elapsed_time()  
  2. {  
  3. printf("Elapsed time:%u secs.n",clock()/CLOCKS_PER_SEC);  

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

  1. #include “stdio.h”  
  2. #include “stdlib.h”  
  3. #include “time.h”  
  4. int main( void )  
  5. {  
  6. long i = 10000000L;  
  7. clock_t start, finish;  
  8. double duration;  
  9. /* 测量一个事件持续的时间*/ 
  10. printf( "Time to do %ld empty loops is ", i );  
  11. start = clock();  
  12. while( i-- ) ;  
  13. finish = clock();  
  14. duration = (double)(finish - start) / CLOCKS_PER_SEC;  
  15. printf( "%f secondsn", duration );  
  16. system("pause");  

在笔者的机器上,运行结果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。


精彩图集

赞助商链接