最近要对linux内核进行修改,要对某个函数进行计时。一时间竟然忘了计时函数的名字,所以写了这个小短文,提醒自己。
#include<stdio.h> #include<time.h> #include<sys/time.h> #include<string.h> #include<stdlib.h> int main(void) { struct timeval starttime,endtime; double timeuse; gettimeofday(&starttime,NULL); sleep(10);/*替换成你需要计时的部分*/ gettimeofday(&endtime,NULL); timeuse=1000000*(endtime.tv_sec-starttime.tv_sec)+endtime.tv_usec-starttime.tv_usec; timeuse/=1000000;/*转换成秒输出*/ printf("timeuse=%f",timeuse); return 0; }
/* Basic time functionality test: check that milliseconds are incremented for each syscall (does not work on host). */ #include <stdio.h> #include <time.h> #include <sys/time.h> #include <string.h> #include <stdlib.h> void err (const char *s) { perror (s); abort (); } int main (void) { struct timeval t_m = {0, 0}; struct timezone t_z = {0, 0}; struct timeval t_m1 = {0, 0}; int i; if (gettimeofday (&t_m, &t_z) != 0) err ("gettimeofday"); for (i = 1; i < 10000; i++) if (gettimeofday (&t_m1, NULL) != 0) err ("gettimeofday 1"); else if (t_m1.tv_sec * 1000000 + t_m1.tv_usec != (t_m.tv_sec * 1000000 + t_m.tv_usec + i * 1000)) { fprintf (stderr, "t0 (%ld, %ld), i %d, t1 (%ld, %ld)\n", t_m.tv_sec, t_m.tv_usec, i, t_m1.tv_sec, t_m1.tv_usec); abort (); } if (time (NULL) != t_m1.tv_sec) { fprintf (stderr, "time != gettod\n"); abort (); } printf ("pass\n"); exit (0); }
linux中clock_gettime也比较好用,就是开销比较大。
#include<stdio.h> #include<time.h> #include<stdlib.h> static inline int64_t get_clock(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC,&ts); return ts.tv_sec*1000000000LL+ts.tv_nsec; } int main() { int64_t t1,t2; t1=get_clock(); sleep(2); t2=get_clock(); printf("t1=%ld\nt2=%ld\n",t1,t2); return 0; }