通常我们读写文件时,都是用系统提供的write和read函数,但是我们都知道文件IO函数操作文件流效率要低于mmap,因为mmap相对write/read省去将数据拷贝到用户态的操作。那么他们之间的差距有多大呢,我们来用事实说话。

1.如何快速创建一个大文件

我们做这个测试之前,需要准备一个足够大的文件来进行对比,那么在linux下,系统为我们准备了现成的方法去创建一个大文件。主要有三种方法:

2.用mmap拷贝文件

先贴上用mmap拷贝文件的方法,如果对mmap不熟悉的可以参考我上一篇总结的文章mmap ---- 内存映射原理。直接上代码:

  1 #include<stdio.h>                                                                                                                                                                                       2 #include<sys/mman.h>3 #include<unistd.h>4 #include<sys/types.h>5 #include<stdlib.h>6 #include<fcntl.h>7 #include<sys/stat.h>8 #include<string.h>9 10 void mmapcopy(int sfd, size_t slen, int dfd) {11     void *sptr = mmap(NULL, slen, PROT_READ, MAP_SHARED, sfd, 0);12     void *dptr = mmap(NULL, slen, PROT_READ | PROT_WRITE, MAP_SHARED, dfd, 0);13     if(dptr == MAP_FAILED) {14         printf("mmap failed.");15         return;16     }17     18     memcpy(dptr, sptr, slen);19 20     munmap(sptr, slen);21     munmap(dptr, slen);22 }23 24 int main(int argc, char* argv[]) {25     if(argc != 3) {26         printf("Usage: %s <src filename> <des filename>", argv[0]);27         return -1;28     }29 30     int sfd;31     int dfd;32 33     if((sfd = open(argv[1], O_RDONLY)) < 0) {34         printf("open src file failed.");35         return sfd;36     }37 38     if((dfd = open(argv[2], O_CREAT | O_RDWR, 0664)) < 0) {39         printf("create dst file failed.");40         return dfd;41     }42 43     struct stat fst;44     fstat(sfd, &fst);45     truncate(argv[2], fst.st_size);46     mmapcopy(sfd, fst.st_size, dfd);47 48     close(sfd);49     close(dfd);50 51     return 0;52 }

3.用普通文件IO拷贝文件

  1 #include<stdio.h>                                                                                                                                                                                       2 #include<unistd.h>3 #include<sys/types.h>4 #include<stdlib.h>5 #include<fcntl.h>6 7 int main(int argc, char* argv[]) {8     if(argc != 3) {9         printf("Usage: %s <src filename> <des filename>", argv[0]);10         return -1;11     }12 13     int sfd;14     int dfd;15 16     if((sfd = open(argv[1], O_RDONLY)) < 0) {17         printf("open src file failed.");18         return sfd;19     }20 21     if((dfd = open(argv[2], O_CREAT | O_RDWR, 0664)) < 0) {22         printf("create dst file failed.");23         return dfd;24     }25 26     char buf[1024];27     int ret;28     while(1) {29         ret = read(sfd, buf, 1024);30         if(ret < 0) {31             printf("read error.");32             break;33         }34         else if(ret == 0) {35             printf("read end.");36             break;37         }38 39         if(ret != write(dfd, buf, ret)) {40             printf("write error.");41             break;42         }43 44     }45 46     close(sfd);47     close(dfd);48 49     return 0;50 }

4.对比测试




  分别测试了500M,1G和2G的文件拷贝,更大的没试,按照上面的规律来看,mmap似乎都是会快一点的,理论和实际都已经证明了,mmap进行文件拷贝的时候,是比较快的,因为它毕竟省去了copy_to_usr这一次拷贝。

mmap拷贝文件与用常规文件IO拷贝文件效率对比相关推荐

  1. linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?

    今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么? 以下是我的工具方法: / ...

  2. * IO流递归拷贝一个文件夹 按源文件夹格式拷贝

    import java.io.*;/*** IO流递归拷贝一个文件夹 按源文件夹格式拷贝** @author silence*/ public class IoCopy2 {private stati ...

  3. IO流递归拷贝一个文件夹里面的所有文件,到另一个文件夹。如果重复不拷贝,可续拷

    import java.io.*;/*** IO流递归拷贝一个文件夹里面的所有文件,到另一个文件夹.如果重复不拷贝,可续拷* @author silence*/ public class IoCopy ...

  4. java编写程序实现文件拷贝_Java IO编程——文件拷贝

    在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理. 需求分析: ·需要实现文件的 ...

  5. IO、文件、NIO【三】

    http://blog.csdn.net/silentbalanceyh/article/details/5252285 (这一个章节将讲到Java里面比较重要的一个章节,这里说一句抱歉,因为最近换工 ...

  6. IO、文件、NIO【草案三】

    (这一个章节将讲到Java里面比较重要的一个章节,这里说一句抱歉,因为最近换工作的原因,一直没有时间继续书写教程,不过接下来我会一直坚持写下去的哈,希望大家能够支持.这个章节主要涉及到常用的文件读写, ...

  7. 17.IO、文件、NIO【草案三】

    (这一个章节将讲到Java里面比较重要的一个章节,这里说一句抱歉,因为最近换工作的原因,一直没有时间继续书写教程,不过接下来我会一直坚持写下去的哈,希望大家能够支持.这个章节主要涉及到常用的文件读写, ...

  8. 10.标准IO和文件IO

    文件基础 概念:一组相关数据的有序集合 文件类型: 常规文件r 目录文件d 字符串设备文件c 块设备文件 b 管道文件p 套接字文件s 符号链接文件l 系统调用和库函数 内核显卡驱动 把数据扔给内核, ...

  9. 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

    文章目录 一.修复包 Dex 文件准备 二.Odex 优化 三.Dex 文件拷贝 四. 源码资源 一.修复包 Dex 文件准备 异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ; ...

最新文章

  1. android约束布局中 链,Android-ConstraintLayout(约束布局)-Chains链(链条布局,Nice)
  2. 人生苦短,不光要用Python,还要在VSCode里用
  3. Redis的数据结构
  4. 全球芯片行业现状分析:大家都在依赖美国 未来如何破局?
  5. 【模板】单源最短路径(弱化版)
  6. oracle inside(4)
  7. 目标2020:'鼠'你最棒!
  8. Android APP开发需求文档范本
  9. 剑指offer51 构建乘积数组(图解)
  10. 软件是怎样控制硬件的?
  11. 运维宝典 | 数据千万条,备份第一条,数据找不回,老板两行泪
  12. 公钥与私钥,数字签名
  13. eclipse如何导入okhttp 2.x源码
  14. Windows10环境中下载DOSBox并进行debug配置
  15. Halcon常用图像预处理算子总结
  16. 携职教育:中级职称《系统集成项目管理师》巨大作用!
  17. 10款提高工作效率的工具软件,你值得拥有!
  18. 阴历阳历相互转换c代码
  19. Maya 基础教程 、 基础操作讲解
  20. 计算机网络树形结构例子,网络拓扑结构大全和实例

热门文章

  1. ResNet50 on cifar-10 test_acc--->92%(by data augmentation)
  2. 量子阱霍尔效应传感器(量子霍尔传感器)
  3. 离线打包maven设置
  4. 【IDEA】IDEA值得推荐的几款优秀插件
  5. CountDownLatch详解以及用法示例
  6. Python调试工具pdb使用详解
  7. pip安装python包出错:Could not find a version that satisfies the requirement skimage (from versions: )...
  8. python加空格_Python在字符串中插入空格
  9. 北京程序员平均月薪超1.2万,又拖后腿了
  10. Webrtc新增FFmpeg视频编解码模块