问题:写入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);
}

Linux下磁盘读写优化的分析_第1张图片

为了测试准确,第一次写入数据后,需要清除了cache和buffer。sysctl-wvm.drop_caches=3

可以看出来一次性写入1M完成写入时间更快,为什么会有这样的结果呢?strace看一下

1次性写入1MBi

Linux下磁盘读写优化的分析_第2张图片

1KBi写入1024次

Linux下磁盘读写优化的分析_第3张图片

结论:user近乎不用时间,sys占用了大部分时间,其余时间都用在kernel层和user层的切换,sys用的时间为systemcall上,可以简单了解下Linuxkernel的架构,主要分为内核层和用户层(kernelspace和userspace),用户层的应用程序会通过调用systemcall转入内核层对数据进行最终的读写操作。

Linux下磁盘读写优化的分析_第4张图片

总之尽量减少系统调用的频繁使用可以减少程序的执行时间,当然不断的读写也会增加磁盘I/O的负载,所以对系统的优化要从优化程序上做起。