背景

从最早bio的只支持阻塞的bio(同步阻塞)

到默认阻塞支持非阻塞nio(同步非阻塞+同步阻塞)(此时加入mmap类)

再到aio(异步非阻塞)

虽然这些api改变了调用模式,但真正执行效率上是否也会有所不同,对此进行了此次java io的性能测试

首先从github上找到了2个项目,然后自己也实现了一个性能对比的实现,以便熟悉各种api

项目1:

https://github.com/stateIs0/io.benchmark

https://www.jianshu.com/u/434239413000

其中filechannel生成文件的代码就是错误的,其实文件中并没有内容



左边没有填入内容,右边是正确的

项目2:

https://github.com/romromov/java-io-benchmark

比较了不同物理硬件上,不同的api的性能差异

可以指定fileSize bufferSize 以及重复的次数 ,并且可以输出平均数和标准差

项目3:

https://github.com/victorsheng/benchmark-anything/tree/master/io-bencmmark

自己的io测试项目

发现mmap必须一次性读取,整个文件才能发挥应有的效果

但是同时整个buffer必须小于Integer.MAX_VALUE 因此,只能适用2G以下的文件,在多次申请小buffer的mmap情况下,性能非常差

硬件

mac系统 ssd硬盘

测试结果

读取:

file size:1024MB buffer size:1024B
InputStreamFileReader,1908
BufferedInputStreamFileReader,2013
InDirectBufferFileChannelReader,1935
DirectBufferFileChannelReader,1722
MultiMmapFileReader,13108
OneMmapFileReader,1231
RandomAccessFileReader,1941 file size:1024MB buffer size:4096B
InputStreamFileReader,606
BufferedInputStreamFileReader,614
InDirectBufferFileChannelReader,639
DirectBufferFileChannelReader,616
MultiMmapFileReader,5341
OneMmapFileReader,1287
RandomAccessFileReader,707 file size:1024MB buffer size:16384B
InputStreamFileReader,360
BufferedInputStreamFileReader,357
InDirectBufferFileChannelReader,371
DirectBufferFileChannelReader,368
MultiMmapFileReader,1905
OneMmapFileReader,1552
RandomAccessFileReader,405

写:

file size:1GB,buffer size:1KB
OutPutFileWriter,5972
BufferedOutPutFileWriter,1631
InDirectBufferFileChannelFileWriter,7021
DirectBufferFileChannelFileWriter,6781
OneMmapFileWriter,1373
MultiMmapFileWriter,26122
RandomAccessFileWriter,6118 file size:1GB,buffer size:4KB
OutPutFileWriter,2438
BufferedOutPutFileWriter,1454
InDirectBufferFileChannelFileWriter,2449
DirectBufferFileChannelFileWriter,3177
OneMmapFileWriter,1365
MultiMmapFileWriter,9124
RandomAccessFileWriter,2331 file size:1GB,buffer size:16KB
OutPutFileWriter,1131
BufferedOutPutFileWriter,1048
InDirectBufferFileChannelFileWriter,1479
DirectBufferFileChannelFileWriter,1606
OneMmapFileWriter,1338
MultiMmapFileWriter,3652
RandomAccessFileWriter,1093

其中,第一列实现,第二列文件大小,第三列时间差

java io读取性能对比的更多相关文章

  1. lua、groovy嵌入到java中的性能对比(转)

    lua和groovy都是可以嵌入到java中的脚本语言.lua以高性能著称,与C/C++在游戏开放中有较多使用,groovy是一个基于Java虚拟机(JVM)的敏捷动态语言,在jvm下有着不错的性能. ...

  2. 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)

    2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...

  3. 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]

    2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集.   上篇传送门: 2017年的golang.python.p ...

  4. java数据库连接池性能对比

    这个测试的目的是验证当前常用数据库连接池的性能. testcase Connection conn = dataSource.getConnection(); PreparedStatement st ...

  5. [java]序列化框架性能对比(kryo、hessian、java、protostuff)

    序列化框架性能对比(kryo.hessian.java.protostuff) 简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...

  6. java io 读取写文件

    java 读取txt文件,汉字乱码,原因是因为文件的编码格式和程序编码采用了不同的编码格式.通常,假如自己不修改的话,windows自身采用的编码格式是gbk(而gbk和gb2312基本上是一样的编码 ...

  7. java -io 读取文件操作

    主要分为字节读取和字符读取,字节读取可以一个一个读取和字节数组读取,字符读取同样之,字符读取适合文本读取,字节读取皆可以 这里直接上代码,读取文件的9个小demo package com.io; im ...

  8. Java IO读取文件之二

    package com.lf.iopreoject; import java.io.BufferedReader; import java.io.File; import java.io.FileIn ...

  9. Java模板引擎性能对比

    模板引擎性能对比 从Github上翻到对JSP.Thymeleaf 3.Velocity 1.7.Freemarker 2.3.23几款主流模板的性能对比,总体上看,Freemarker.Veloci ...

随机推荐

  1. 在CentOS6.5部署Redis为开机自启

    2 - redis的生产启动方案 要把redis作为一个系统的daemon进程 去运行的,每次系统启动,redis进程一起启动,配置方案如下: 1. 在redis utils 目录下,有个redis_ ...

  2. 【基础算法-模拟-例题-玩具谜题】-C++

    原题链接P1563 玩具谜题 这道题依然是一道模拟题目,就简单讲讲坑点: 1.有些时候在转圈的时候要用到它们站成了一个环的性质! 2.小人面朝的方向影响了它们左右的方向! 3.注意考虑顺时针逆时针与小 ...

  3. 在 .h 和 cpp 中查找 :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r

    :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r -w "whole" 匹配整个 ...

  4. 洛谷 P1635 跳跃

    题目: 题目背景 NOIP即将迎来周年华诞.在这一个春秋的历程里,NOIP领导全国oier,建设高效.稳定.快捷.开放的社会主义现代化OI.在新的一年里,YZOJ将再接再厉,积极探寻成长之路,更好地为 ...

  5. Python开发:NumPy学习(一)ndarray数组

    一.数据维度 一个数据表达一个含义,一组数据表达一个或多个含义. 数据维度概念:一组数据的组织形式,其中有一维数据.二维数据.多维数据.高维数据. 1.  一维数据 一维数据由对等关系的有序或无序数据 ...

  6. string的赋值

    string的赋值 string s1="123456"; 一:     只能在刚开始定义的时候用: (1)     从后往前赋值     string s2(s1,3);     ...

  7. ehcache的使用 Shiro与Ehcache的结合(附:EhcacheUtils)

    ehcache 缓存的使用 合理的使用缓存会极大的提高程序的运行效率.切记:缓存请勿滥用. 配置ehcache与Shiro shiro初识请查看该文章 https://blog.csdn.net/py ...

  8. Spring Boot从入门到实战(十):异步处理

    原文地址:http://blog.jboost.cn/2019/07/22/springboot-async.html 在业务开发中,有时候会遇到一些非核心的附加功能,比如短信或微信模板消息通知,或者 ...

  9. cesium 学习(五) 加载场景模型

    cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...

  10. Docker 工作原理及容器化简易指南

    Docker 非常棒! 它使软件开发者无需担心配置和依赖性,在任何地方打包,发送和运行他们的应用程序.而在与 Kubernetes 相结合后,它使应用集群部署和管理变得更方便.这使得 Docker 深 ...