本篇博客主要介绍统计程序耗时的一些方法,以及与其相关的一些函数与概念的介绍与说明。
统计程序耗时 time 类别 UTC时间: 世界时钟,Coordinated Universal time日历时间: Calendar time, 相对时间。“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。 epoch: 时间点,整数,此时的时间与标准时间点相差的秒数。clock tick: 时钟滴答数,与cpu相关,一个 clock tick不是一个CPU时钟周期,而是C/C++的基本计时单位。
系统CPU时间: 程序在系统核心态中执行的时间用户CPU时间: 程序在用户态中执行的时间实际运行时间: 命令从执行到终止的时间
计时函数 clock(): 获取cpu时间 定义介绍: 计算CPU耗时(系统CPU时间 + 用户CPU时间)
1 2 3 4 5 6 7 8 9 10 11 clock_t clock (void ) ;#ifndef _CLOCK_T_DEFINED typedef long clock_t ;#define _CLOCK_T_DEFINED #endif #define CLOCKS_PER_SEC ((clock_t)1000)
使用示例:
1 2 3 4 clock_t c_start = clock ();do_something ();clock_t c_end = clock ();std::cout <<"CPU time: " << " " << (double )(c_end - c_start) / (double ) CLOCKS_PER_SEC << " s\n" ;
问题说明:
如果超过一个小时,将要导致溢出.
函数clock没有考虑CPU被子进程使用的情况.
也不能区分用户空间和内核空间.
times():获取具体的cpu时间 定义介绍: 返回的是过去一段时间内时钟滴答的次数
1 2 3 4 5 6 7 8 9 10 #include <time.h> clock_t times (struct tms *buf) ;strace tms{ clock_t tms_utime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_cstime; }
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <sys/types.h> #include <sys/times.h> struct tms tmsstart , tmsend ;clock_t start, end;start=times (&tmsstart); do_something ();end=times (&tmsend); static long clktck = sysconf (_SC_CLK_TCK);printf ("real:%7.2f\n" , (end -start)/(double )clktck);printf ("user-cpu:%7.2f\n" , (tmsend->tms_utime - tmsstart->tms_utime)/(double )clktck);printf ("system-cpu:%7.2f\n" , (tmsend->tms_stime - tmsstart->tms_stime)/(double )clktck);printf ("child-user-cpu:%7.2f\n" , (tmsend->tms_cutime - tmsstart->tms_cutime)/(double )clktck);printf ("child-system-cpu:%7.2f\n" , (tmsend->tms_cstime - tmsstart->tms_cstime)/(double )clktck);
clock_gettime():获取线程时间 定义: 基于 Linux C的时间函数,也可以用于计算精度和纳秒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <time.h> int clock_gettime (clockid_t clk_id, struct timespec *tp) ;struct timespec {time_v tv_sec; time_v tv_nsec; };
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 void constructFBString (int size) {struct timespec timeStart , timeEnd ;clock_gettime (CLOCK_THREAD_CPUTIME_ID, &timeStart); for (int i=0 ; i<10000 ; i++){ fbstring fbstr1 (size, 'a' ) ;fbstring fbstr2 (size, 'b' ) ;fbstr1 += fbstr2; fbstr1.find ('b' ); } clock_gettime (CLOCK_THREAD_CPUTIME_ID, &timeEnd); double res = (timeEnd.tv_sec - timeStart.tv_sec)* 1000 + (timeEnd.tv_nsec-timeStart.tv_nsec)/ 1000000 ; printf ("FBString thread time: %lf\n" , res);}
gettimeofday():获取当前系统时间 定义: 获取当前系统时间,返回值为一个绝对值,从1970年到现在经过了多少秒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int gettimeofday ( struct timeval * tv , struct timezone * tz ) ;struct timeval { long tv_sec; long tv_usec; }; struct timezone {int tz_minuteswest; int tz_dsttime; };
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> #include <sys/time.h> #include <unistd.h> int main () {struct timeval tv ;struct timezone tz ;gettimeofday (&tv,&tz);printf (“tv_sec:%d\n”,tv.tv_sec);printf (“tv_usec:%d\n”,tv.tv_usec);printf (“tz_minuteswest:%d\n”,tz.tz_minuteswest);printf (“tz_dsttime:%d\n”,tz.tz_dsttime);}
gmtime(): 转换时间 定义: 将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 struct tm *gmtime (const time_t *timep) ;struct tm {int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; };
使用示例:
1 2 3 4 5 6 7 8 9 10 #include <time.h> main (){char *wday[] = {"Sun" , "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" };time_t timep;struct tm *p ;time (&timep);p = gmtime (&timep); printf ("%d%d%d" , (1900 +p->tm_year), (1 +p->tm_mon), p->tm_mday);printf ("%s%d;%d;%d\n" , wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);}
asctime() 定义: 将结构中的信息转换为真实世界的时间,以字符串的形式显示
1 char *asctime (const struct tm* timeptr)
使用示例:
1 2 3 4 5 6 7 8 9 #include <time.h> main (){time_t timep;time (&timep);printf ("%s" , asctime (gmtime (&timep)));}
最后更新时间:2022-09-01 20:59:40
欢迎交流,转载请注明文章来源!