java io读取性能对比
背景
从最早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
其中,第一列实现,第二列文件大小,第三列时间差
欢迎大家访问:
我的博客