最近要對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;}
這是kvm中使用一段代碼:
/* 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 ();}intmain (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;}
gcc 編譯的時候加上要加上-lrt, -l表示連結指定庫,rt表示連結librt庫。