当前位置: 首页 > news >正文

资源网站不好找了/亚马逊跨境电商个人开店

资源网站不好找了,亚马逊跨境电商个人开店,网站商品支付怎么做,郴州网络推广教程文件读写性能受到诸多因素的影响,其中缓冲区是不容忽视的因素 下面看几个示例来比较一下各种文件操作的性能对比 1、单字节拷贝 将一个37M的文件test1.txt读出来然后写入到dest.txt,实现文件的拷贝。 示例代码: Testpublic void perByteO…
文件读写性能受到诸多因素的影响,其中缓冲区是不容忽视的因素

下面看几个示例来比较一下各种文件操作的性能对比

1、单字节拷贝

将一个37M的文件test1.txt读出来然后写入到dest.txt,实现文件的拷贝。
在这里插入图片描述
示例代码:

	@Testpublic void perByteOperation() {LOGGER.info("开始单字节单字节复制文件...");long start = System.currentTimeMillis();try (FileInputStream fis = new FileInputStream(TEST_PATH + "test1.txt");FileOutputStream fos = new FileOutputStream(TEST_PATH + "dest.txt")) {int i;while ((i = fis.read()) != -1) {fos.write(i);}} catch (Exception e) {LOGGER.error("单字节单字节复制文件异常", e);}LOGGER.info("结束单字节单字节复制文件...,耗时:{}ms", System.currentTimeMillis() - start);}
[INFO ][2020/09/08 08:55:03][main] - 开始单字节单字节复制文件...
[INFO ][2020/09/08 08:57:31][main] - 结束单字节单字节复制文件...,耗时:148090ms

耗时148s,可怕!

2、采用100个字节的缓冲区

示例代码:

	@Testpublic void bufferOperationWith100() {LOGGER.info("开始带100字节缓冲区复制文件...");long start = System.currentTimeMillis();try (FileInputStream fis = new FileInputStream(TEST_PATH + "test1.txt");FileOutputStream fos = new FileOutputStream(TEST_PATH + "dest.txt")) {byte[] buf = new byte[100];int len;while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}} catch (Exception e) {LOGGER.error("带100字节缓冲区复制文件", e);}LOGGER.info("开始带100字节缓冲区复制文件...,耗时:{}ms", System.currentTimeMillis() - start);}
[INFO ][2020/09/08 08:59:05][main] - 开始带100字节缓冲区复制文件...
[INFO ][2020/09/08 08:59:07][main] - 开始带100字节缓冲区复制文件...,耗时:2237ms

可见,增加了缓冲区之后,速度大大提高了。

3、采用BufferedStream

BufferedStream采用了 private static int DEFAULT_BUFFER_SIZE = 8192; 8Kb的缓冲区。
示例代码:

	@Testpublic void bufferStreamByteOperation() {LOGGER.info("开始带缓冲区复制文件...");long start = System.currentTimeMillis();try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(TEST_PATH + "test1.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(TEST_PATH + "dest.txt"))) {int i;while ((i = bis.read()) != -1) {bos.write(i);}} catch (Exception e) {LOGGER.error("带缓冲区复制文件文件异常", e);}LOGGER.info("开始带缓冲区复制文件...,耗时:{}ms", System.currentTimeMillis() - start);}
[INFO ][2020/09/08 09:01:18][main] - 开始带缓冲区复制文件...
[INFO ][2020/09/08 09:01:20][main] - 开始带缓冲区复制文件...,耗时:2350ms

为啥我们使用了缓冲流,没有明显提高呢?原因是虽然读取写入使用了缓冲流,但bos.write(i);方法是按单字节写入的,调用次数过多。

4、在BufferedStream基础上,写入的时候新增一个8KB的缓冲

	@Testpublic void bufferStreamBufferOperation() {LOGGER.info("bufferStreamBufferOperation开始带缓冲区复制文件...");long start = System.currentTimeMillis();try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(TEST_PATH + "test1.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(TEST_PATH + "dest.txt"))) {byte[] buf = new byte[8196];int i;while ((i = bis.read(buf)) != -1) {bos.write(buf, 0, i);}} catch (Exception e) {LOGGER.error("带缓冲区复制文件文件异常", e);}LOGGER.info("开始带缓冲区复制文件...,耗时:{}ms", System.currentTimeMillis() - start);}
[INFO ][2020/09/08 09:05:02][main] - bufferStreamBufferOperation开始带缓冲区复制文件...
[INFO ][2020/09/08 09:05:02][main] - 开始带缓冲区复制文件...,耗时:132ms

5、不采用缓冲流,只新增8KB的缓冲数组

	@Testpublic void streamBufferOperation() {LOGGER.info("streamBufferOperation开始带缓冲区复制文件...");long start = System.currentTimeMillis();try (FileInputStream fis = new FileInputStream(TEST_PATH + "test1.txt");FileOutputStream fos = new FileOutputStream(TEST_PATH + "dest.txt")) {byte[] buf = new byte[8196];int i;while ((i = fis.read(buf)) != -1) {fos.write(buf, 0, i);}} catch (Exception e) {LOGGER.error("带缓冲区复制文件文件异常", e);}LOGGER.info("开始带缓冲区复制文件...,耗时:{}ms", System.currentTimeMillis() - start);}
[INFO ][2020/09/08 09:06:27][main] - streamBufferOperation开始带缓冲区复制文件...
[INFO ][2020/09/08 09:06:27][main] - 开始带缓冲区复制文件...,耗时:120ms

总结:

我们可以看到4,5花费的时间差不多,但我们推荐第4种方案。但在实际代码中每次需要读
取的字节数很可能不是固定的,有的时候读取几个字节,有的时候读取几百字节,这个时候有一个固定大小较大的缓冲,也就是使用 BufferedInputStream 和
BufferedOutputStream 做为后备的稳定的二次缓冲,就非常有意义了。

拓展:

DMA(直接内存访问),数据从磁盘经过总线直接发送到目标文件,无需经过内存和 CPU 进行数据中转,这种方式更快。

	/*** @Description 采用的是DMA(直接内存访问)也就是数据从磁盘经过总线直接发送到目标* 文件,无需经过内存和 CPU 进行数据中转:* @author chenwb* @date 2020/9/8 9:21*/@Testpublic void fileChannelOperation() throws IOException {LOGGER.info("fileChannelOperation开始复制文件...");long start = System.currentTimeMillis();FileChannel in = FileChannel.open(Paths.get(TEST_PATH + "test1.txt"), StandardOpenOption.READ);FileChannel out = FileChannel.open(Paths.get(TEST_PATH + "dest.txt"), StandardOpenOption.CREATE,StandardOpenOption.WRITE);in.transferTo(0, in.size(), out);LOGGER.info("结束复制文件...,耗时:{}ms", System.currentTimeMillis() - start);}
[INFO ][2020/09/08 09:22:30][main] - fileChannelOperation开始复制文件...
[INFO ][2020/09/08 09:22:30][main] - 结束复制文件...,耗时:48ms
http://www.jmfq.cn/news/4934557.html

相关文章:

  • 网站需要在哪些方面备案/广州百度推广外包
  • 做电商平台网站有哪些内容/外贸国际网站推广
  • 个人网站开发的论文/搜索引擎是什么
  • 网站全屏轮播代码 js/中国站长工具
  • 公司自己建立网站/优化关键词的作用
  • 莒县住房和城乡规划建设局网站/站长之家怎么用
  • 乐昌门户网站/独立站seo是什么
  • 深圳网站建设大公司好/杭州排名优化公司
  • 广州网站建设专家/国内最近发生的重大新闻
  • 网上购物网站建设/排名优化关键词公司
  • 外文网站制作/磁力猫torrentkitty官网
  • 如何选择网站建设/谷歌seo优化
  • 做sm网站违法吗/怎么推广自己的微信号
  • 教育类网站前置审批/成都私人做网站建设
  • 做网站前端要会什么/磁力bt种子搜索神器
  • app应用网站单页模板下载/小时seo
  • 愚人网站建设/360优化大师软件
  • 东莞网站SEO优化托管/海外推广专员
  • 石家庄市网站建设培训班/百度销售是做什么
  • 智慧团建初始密码123456/seo优化推广工程师招聘
  • 浙江义乌小商品批发进货网/seo项目培训
  • 政府网站建设管理通知/武汉seo诊断
  • wordpress双语言设置/公司网站怎么优化
  • win8建立网站/网络营销课程主要讲什么内容
  • 国内专门做情侣的网站商城/百度产品大全
  • 企业查在线查询官网/seo优化专员招聘
  • pc网站建设意见/信息流优化师怎么入行
  • 所有网站打不开/seo软文推广工具
  • 建盏/夫唯seo视频教程
  • 可以中英切换的网站怎么做/seo推广专员工作内容