malloc与缺页的一些的时间测量
时间函数
struct timespec
{
time_t tv_sec;
long int tv_nsec;
};
long sys_clock_gettime (clockid_t which_clock, struct timespec *tp);
这个函数最终会是系统调用,会进入内核,所以估计这个函数的执行时间会比较久,所以先测试这个函数的执行时间代码如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
struct timespec timeStart = {0,0},timeEnd = {0,0};
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeStart);
for(int i=0;i<1000;++i)
{
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeEnd);
}
printf("timeStart = %lus,%luns\n",timeStart.tv_sec,timeStart.tv_nsec);
printf("timeEnd = %lus,%luns\n",timeEnd.tv_sec,timeEnd.tv_nsec);
printf("ever sys_gettime call spend %luns\n",(timeEnd.tv_nsec-timeStart.tv_nsec)/1001);
return 0;
}
最终测试结果摆动较大,在100ns至500ns间摆动,考虑到误差,取均值300ns
开始测试malloc
缺页不频繁的情况下,主要的开销是malloc的算法开销。
第一次测试由于malloc后立马free,所以缺页率非常低
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,char** argv)
{
if(argc!=2)
{
fprintf(stderr,"error args\n");
exit(-1);
}
void *p;
int sz = atoi(argv[1]);
long int sum = 0;
struct timespec timeStart = {0,0},timeEnd = {0,0};
for(int i=0;i<1000;++i)
{
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeStart);
p = malloc(sz);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeEnd);
sum += timeEnd.tv_nsec - timeStart.tv_nsec;
free(p);
}
printf("malloc %dByte every time for 1000loops,%luns per\n",sz,sum/1000);
return 0;
}
可以看到这种情况下,每次的时间在200ns到800ns间摆动,由于还加了sys_gettime的开销,所以最终的一次malloc的开销大概在200ns左右。注意,这是在没有缺页的情况下!!!!!
而如果发生了缺页,则时间非常之就,比如将上面的代码的free(p)注释掉,然后执行
wd@ub-linux:malloc$ ./a.out 4096
malloc 4096Byte every time for 1000loops,3855ns per
会发现时间变得特别巨大,直接跳到了3800ns+。这个参数是4096,就是说每次申请4k的内存,就是一页内存而不还给os,这样几乎每次申请都会出现缺页。可以看到缺页处理时间几乎是malloc本身算法执行时间的10倍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)