程序的运行效率很重要,其往往是评价程序优劣性的直接标准。程序运行效率的最简单方法就是计算程序的运行时间。

计算时间主要可以使用的函数有:clock()、time()、gettimeofday()。

gettimeofday() 函数的精度最高,为微秒级别;clock() 函数的精度次之,为 10ms 级别;time() 函数的精度最低,为 1s 级别。

clock() 函数

clock() 函数是 ANSI C 的标准库函数,是 C/C++ 十分常用的计时函数,其声明定义在 time.h 头文件中,精度10ms

模型:

clock_t clock( void ); 

几点注意:

它返回的是 CPU 耗费在本程序上的时间。也就是说,途中 sleep 的话,
由于 CPU 资源被释放,那段时间将不被计算在内。因此,若函数中存在 sleep() 函数,
则 sleep() 函数消耗的时间将不包含在内;

得到的返回值其实就是耗费在本程序上的 CPU 时间片的数量,也就是 Clock Tick 的值。
该值必须除以 CLOCKS_PER_SEC 这个宏值,才能最后得到以秒为单位的运行时间。
在 POSIX 兼容系统中,CLOCKS_PER_SEC 的值为 1,000,000 的,也就是 1MHz。

这个函数的精度不适很高,大约为 10ms,低于精度的程序全部输出 0ms。
此函数适合用于计算一些大型程序,或循环程序。

time() 函数

time() 函数来获得当前日历时间(Calendar Time)。所谓的日历时间就是用“从一个标准时间点(一般是1970年1月1日0时0分0秒)到此时的时间经过的秒数”来表示的时间。其原型为:

time_t time(time_t * timer); 

精度只有 1s

gettimeofday()

精度较高的函数,到```微秒``,原型为:

#include<sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz )

gettimeofday() 会把目前的时间用 tv 结构体返回,当地时区的信息则放到 tz 所指的结构中。其结构体定义为:

struct  timeval {
   		long  tv_sec;/*秒*/
	long  tv_usec;/*微妙*/
};

struct  timezone{
	int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
	int tz_dsttime;/*type of DST correction*/
};

使用例如:

#include <stdio.h>
#include <sys/time.h>
int main()
{
	struct  timeval  start;
   		struct  timeval  end;
   		unsigned long timer;
   		gettimeofday(&start,NULL);
   		printf("hello world!\n");
   		gettimeofday(&end,NULL);
   		timer = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
   		printf("timer = %ld us\n",timer);
   		return 0;
}