C++程序内计算时间开销的方法举例

在Linux系统下,有几种在C/c++常用的计时方法,


1.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 seconds\n", duration );
16       return 0;
17     } 


在time.h文件中,常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元.
在linux系统下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux打印出来的值是1000000,表示的是微妙。
可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。
clock() 返回从“开启这个程序进程”到“程序中调用clock()函数”时这之间的 CPU 时钟计时单元(clock tick)数,在 MSDN 中称之为挂钟时间(wal-clock)
值得注意的是,当程序涉及多线程的时候,clock得到的时间就会比实际运行的时间要多很多,你心里数着可能三秒运行完成,但是得到的CPU 时间确实好几十秒.
在运行程序的命令前面加上time ./....,运行完成后,可以看到有(举个栗子):
26.440000s  duration


real 0m3.438s
user 0m26.457s
sys 0m0.016s
real 时间接近你心里默数的时间,user 则接近duration CPU时间,
这里给出网上摘抄的解释:
"real: 墙上时间,即程序从开启到结束的实际运行时间
user: 执行用户代码所花的实际时间(不包括内核调用),指进程执行所消耗的实际CPU时间
sys:该程序在内核调用上花的时间


在单线程串行的时候,只有一个线程在运行,那么user所代表的就是一个cpu的时间。然而,当到多线程的情况下,一个进程可能有多个线程并行执行,但是user把所有的线程时间都加起来了,也就是算了一个总时间,这样,user的时间也就基本上等于单线程时的user时间。
--https://my.oschina.net/gaussik/blog/515002
"
因此,在多线程代码中想要计算实际时间,还需要别的方法了,请看下文;


2.gettimeofday(&start_run,NULL)


 1     #include<stdio.h>
 2     #include<sys/time.h>
 3     #include<unistd.h>
 4     int main()
 5     {
 6         struct  timeval    start_run;
 7         struct  timezone   end_run;
 8 
 9         gettimeofday(&start_run,NULL);
           gettimeofday(&end_run,NULL);
10         diff = 1000000 * (end_run.tv_sec-start_run.tv_sec)+ end_run.tv_usec-start_run.tv_usec;
11         printf(“thedifference is %ld\n”,diff);
12         std::cout << "运行了:" << (diff) << "微秒" << std::endl;
13         return 0;
14     }
gettimeofday()有两个参数,第一个是获取当前时间,第二个是获取timezone的数值,这里我们只用了第一个参数.
这个函数的计算精度到微秒级别.


3.time()


1     #include <time.h> 
2     #include <stdio.h> 
3     #include <dos.h> 
4     int main() {
5       time_t begin_time = 0,end = 0;
6       begin_time=time();
6       end=time();
7       std::cout << "运行了:" << (end-begin_time) << "秒" << std::endl;
8       return 0; 
9     }


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


time_t time(time_t * timer); 
如果 timer 不是 NULL,则返回值还存放在 timer 中。如果遇到错误,则返回 -1(转换成 time_t 类型)。time_t 是一个 long 类型。如果你已经声明了参数 timer,你可以从参数 timer 返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年 1月1日0时0分0秒)到现在此时的秒数。如果参数为空(NULL),函数将只通过返回值返回现在的日历时间.
这是一个只能精确到秒的计时方法.





  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值