问题:写入1MBi大小数据到文件里,1次写入1K共写1024次和1次性写入1M仅写1次的速率差异是多大?哪个更快?为什么呢?不妨测试一下:
1MBi文件,一次性写入1MBi
#include#include #include #include #include int main(int argc,char *aa[]){int fd,fd1;char buffer[1048576];fd=open(aa[1],O_RDONLY,S_IRUSR);if(fd==-1){printf("file not found.\n");return -1;}fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);if(fd1!=-1){}ssize_t n;while(n=read(fd,buffer,1048576)){write(fd1,buffer,n);printf("Writing.....\n");}close(fd);close(fd1);}
1MBi文件,一次写入1KBi,共写1024次
#include#include #include #include #include int main(int argc,char *aa[]){int fd,fd1;char buffer[1024];fd=open(aa[1],O_RDONLY,S_IRUSR);if(fd==-1){printf("file not found.\n");return -1;}fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);if(fd1!=-1){}ssize_t n;while(n=read(fd,buffer,1024)){write(fd1,buffer,n);printf("Writing.....\n");}close(fd);close(fd1);}
为了测试准确,第一次写入数据后,需要清除了cache和buffer。sysctl-wvm.drop_caches=3
可以看出来一次性写入1M完成写入时间更快,为什么会有这样的结果呢?strace看一下
1次性写入1MBi
1KBi写入1024次
结论:user近乎不用时间,sys占用了大部分时间,其余时间都用在kernel层和user层的切换,sys用的时间为systemcall上,可以简单了解下Linuxkernel的架构,主要分为内核层和用户层(kernelspace和userspace),用户层的应用程序会通过调用systemcall转入内核层对数据进行最终的读写操作。
总之尽量减少系统调用的频繁使用可以减少程序的执行时间,当然不断的读写也会增加磁盘I/O的负载,所以对系统的优化要从优化程序上做起。