编写代码时应当注意避免滥用系统调用
减少fread与read系统调用的次数
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <sys/mman.h> void main() { int fd = open("test.file",o); struct stat statbuf; char *start; char buf[2] = {0}; int ret = 0; fstat(fd,&statbuf); start = mmap(NULL,statbuf.st_size,PROT_READ,MAP_PRIVATE,fd,0); do{ *buf = start[ret++]; }while(ret < statbuf.st_size); }
同样是遍历整个文件,但是读文件的过程中不需要使用系统调用,直接把文件当成内存buffer来读就行了。其原理是:mmap的执行,仅仅是在内核中建立了文件与虚拟内存空间的映射关系。用户访问这些虚拟内存空间时,页表里面并没有这些空间的表项,于是CPU产生缺页异常。内核捕捉这些异常,逐渐将文件读入内存,并建立相关的页表项。
size_t fread(void*buffer,size_tsize,size_tcount,FILE*stream);
http://www.newsmth.net/pc/pccon.php?id=10003130&nid=377681
http://hi.baidu.com/_kouu/blog/item/e33c618a66cd3d769e2fb400.html