最近要对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 ();
}
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;
}gcc 编译的时候加上要加上-lrt, -l表示链接指定库,rt表示链接librt库。

本文介绍了在Linux环境下,为了对内核函数进行精确计时,如何使用clock_gettime函数。虽然该函数具有一定的开销,但在需要高精度计时的场景下十分实用。
1258

被折叠的 条评论
为什么被折叠?



