code:
#include <stdio.h> #include <stdarg.h> #include <unistd.h>/*for sleep*/ #include <sys/times.h>/*for times*/ #include <sys/time.h>/*for getimeofday*/ //#include <sys/conf.h>/*old system for sysconf*/ #include <time.h>/*for clock,time,clock_gettime*/ void demo_time01() { time_t start =time(NULL);//获取系统时间,只精确到秒,不能反映程序真正的运行时间 long i =0; while(i<10e8) { i++; } time_t end=time(NULL); printf("执行时间:%ld s\n",end - start); } void demo_time02() { struct timeval start; struct timeval end; gettimeofday(&start,NULL); long i = 0; while(i<10e8) { i++; } gettimeofday(&end,NULL); long start_ms=start.tv_sec*1000+start.tv_usec/1000; long end_ms=end.tv_sec*1000+end.tv_usec/1000; printf("执行时间:%ld ms\n",end_ms - start_ms); } void demo_time03() { struct tms t; long i = 0; while(i<10e6) { i++; } times(&t); long clock_per_sec=sysconf(_SC_CLK_TCK); double clock_per_ms = (double)clock_per_sec/1000; printf("用户空间时间:%.4lf 内核空间时间:%.4lf\n", t.tms_utime/clock_per_ms, t.tms_stime/clock_per_ms ); } void demo_time04() { long i = 0; while(i<10e6) { i++; } clock_t ticks=clock();//32bit最多记录72min,从进程开始就开始记录,不能控制 double secs=(double)ticks/CLOCKS_PER_SEC;//us printf("执行时间:%.4lf ms\n", secs*1000); } void demo_time05() { struct timespec start;//精确到纳秒,CLOCK_PROCESS_CPUTIME_ID能反映出程序真正的运行时间,方便控制 struct timespec end; clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start); long i = 0; while(i<10e8)//10e6 17ms, 10e8 1700ms 测试耗时为大概时间 { i++; } clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&end); double start_ms =start.tv_sec*1000+start.tv_nsec/1000000;//转为毫秒 double end_ms =end.tv_sec*1000+end.tv_nsec/1000000; printf("clock_gettime执行时间:%.4lf ms\n",end_ms - start_ms); } int main() { struct tms t; demo_time04();//从进入main函数开始计时,不在前面执行会记录到其他函数的时间 demo_time01(); demo_time05(); times(&t); long clock_per_sec=sysconf(_SC_CLK_TCK); double clock_per_ms = (double)clock_per_sec/1000; printf("用户空间时间:%.4lfms 内核空间时间:%.4lfms \n", t.tms_utime/clock_per_ms, t.tms_stime/clock_per_ms ); return 0; }