• 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
    

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

  • 相关阅读:
    页面 笔记
    快速统计一个数二进制中1的个数
    [JAVA] String 拼接效率
    [JAVA] String常用方法
    [letcode] 832 Flipping an Image
    [java]冒泡排序
    SharedPreferences
    归并排序
    安全退出调用多个Activity的Application
    Activity生命周期
  • 原文地址:https://www.cnblogs.com/victor2302/p/11377795.html
Copyright © 2020-2023  润新知