在Linux 环境下,计算一个循环或者处理事件类事情花费多长时间计算C程序运行的时间,可以通过以下三个函数来实现:clock(),time(),gettimeofday()
示例:
long i = 100000000L;
/* clock函数持续的时间*/
clock_t start, finish;
double duration;
start = clock();
cout << i << "loops is";
while(i--);
finish = clock();
duration = ((double)(finish - start) / CLOCKS_PER_SEC);
cout << "Clock() " << duration << "seconds"<<endl;
/* gettimeofday函数持续的时间*/
i = 100000000L;
struct timeval start1;
struct timeval end1;
unsigned long timer1;
gettimeofday(&start1, NULL);
while (i--);
gettimeofday(&end1, NULL);
int speedtime = (end1.tv_sec * 1000000 + end1.tv_usec) - (start1.tv_sec * 1000000 + start1.tv_usec);
cout << "gettimeofday = "<< speedtime << endl;
/* time函数持续的时间*/
i = 100000000L;
time_t t1, t2;
time(&t1);
while (i--);
time(&t2);
cout << "time() " << t2-t1 << endl;
1.clock()
获取时间精度:毫秒
头文件: time.h
函数原型: clock_t clock( void );
返回值:
成功:返回从“开启这个程序进程”到“程序中调用clock()函数”时这之间的 CPU 时钟计时单元(clock tick)数。
失败:-1 表示无法得到处理器时间。
注意:
1)程序中遇到sleep()函数消耗的时间不含在内,因为此时CPU资源被释放。
2)函数返回值为CPU时间片数量(clock tick)值,该值必须除以CLOCKS_PER_SEC这个宏值得到秒为单位的运行时间
在 POSIX 兼容系统中,CLOCKS_PER_SEC的值为 1,000,000 的,也就是 1MHz。
在 Windows 系统下的 VC2019 中,其定义为:
这表示硬件滴答 1000 下是 1 秒,也即可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加 1。
2.time()
获取时间精度:秒
函数解释:获取当前的日历时间(Calendar Time)。即从标准时间点(1970年1月1日0时0分0秒)运行到此时时间经过的秒数。
函数原型:
time_t time(time_t * timer);
3.gettimeofday()函数
时间精度:微秒
函数原型:gettimeofday()
#include<sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz )
参数解析:**gettimeofday()会把目前的时间用 tv 结构体返回,当地时区的信息则放到 tz 所指的结构中。其结构体定义为:
返回值:
情况1:tv 或者 tz 都可以为空。如果为空则就不返回其对应的结构体。函数执行成功后返回 0,失败后返回 -1,错误代码存于 errno 中
情况2:第二个参数一般都为空,因为我们一般都只是为了获得当前时间