Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1914308
  • 博文数量: 498
  • 博客积分: 2078
  • 博客等级: 大尉
  • 技术积分: 1645
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-18 22:43
个人简介

安大

文章分类

全部博文(498)

文章存档

2017年(1)

2016年(2)

2015年(21)

2014年(90)

2013年(101)

2012年(267)

2011年(16)

分类: LINUX

2013-12-02 12:37:22

思考问题:写入1MBi大小数据到文件里,1次写入1K共写1024次和1次性写入1M仅写1次的速率差异是多大?哪个更快?为什么呢?不妨测试一下:
1MBi文件,一次性写入1MBi 。注:以前全部按照IEC标准  

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. int main(int argc,char *aa[]){
  7. int fd,fd1;
  8. char buffer[1048576];
  9. fd=open(aa[1],O_RDONLY,S_IRUSR);
  10. if(fd==-1){
  11. printf("file not found.\n");
  12. return -1;
  13. }
  14. fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);
  15. if(fd1!=-1){
  16. }
  17. ssize_t n;
  18. while(n=read(fd,buffer,1048576)){
  19. write(fd1,buffer,n);
  20. printf("Writing.....\n");
  21. }
  22. close(fd);
  23. close(fd1);
  24. }
1MBi文件,一次写入1KBi,共写1024次

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. int main(int argc,char *aa[]){
  7. int fd,fd1;
  8. char buffer[1024];
  9. fd=open(aa[1],O_RDONLY,S_IRUSR);
  10. if(fd==-1){
  11. printf("file not found.\n");
  12. return -1;
  13. }
  14. fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);
  15. if(fd1!=-1){
  16. }
  17. ssize_t n;
  18. while(n=read(fd,buffer,1024)){
  19. write(fd1,buffer,n);
  20. printf("Writing.....\n");
  21. }
  22. close(fd);
  23. close(fd1);
  24. }


为了测试准确,第一次写入数据后,为了保证测试的准确性,需要清除了cache和buffer。echo 3 >  /proc/sys/vm/drop_caches
可以看出来一次性写入1M完成写入时间更快,为什么会有这样的结果呢?strace看一下
1次性写入1MBi

1KBi写入1024次

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

总之尽量减少系统调用的频繁使用可以减少程序的执行时间,当然不断的读写也会增加磁盘I/O的负载,所以对系统的优化要从优化程序上做起。
阅读(2428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~