Java 读取文件缓存如何设置

今天做了一下测试,利用Java读取一个大文件 如何达到最大的速度。

资源当然得充分利用,笔者的环境是   联想thinkpad E490 

CPU 是 Intel I5 8265U 核心是4核心  8个逻辑处理器

说实话我现在也不太懂 核心和处理器的关系,即便查了多遍文档,如果你用过

虚拟机的话 创建虚拟机的时候会让你选核心选处理器,网上资料等好多都说的恰恰相反

话不多说直接上代码

 

public  static FileInputStream in;
    public  static BufferedInputStream bi;
    public  static DataInputStream di;

    public static void main(String[] args) throws IOException {

        Long startTime = System.currentTimeMillis();

        String FileData="C:/mq4/TicksDataByte";  
        in = new FileInputStream(new File(FileData));  
        bi = new  BufferedInputStream(in);
        di = new DataInputStream(bi);
        byte by[] = new byte[1024*1024*7];
        int num=0;
        while((num=bi.read(by))!=-1)
        {
            //while(di.read)
        }

        Long endTime = System.currentTimeMillis();;
        Long times = endTime - startTime;
        System.out.println("时间:" + times);

    }

by 缓存字节数组 读取操作则什么都不做,今天我们讨论想说明的问题就是这个byte 的字节数

很多的示例范本给出的都是 1K 即 1024 字节作为缓存,这当然没有问题,但是效率能不能达到最

大话就不好说了。我们看下运行时间,文本测试文件大小为 8.46G= 8663M

19407 毫秒

增大 缓存字节数

1024*8   19873

1024*16  19715

1024*32   16605

1024*64    17510

1024*1024 10647

1024*1024*2 10025

1024*1024*3 9934

1024*1024*4  9967

1024*1024*5  9510

1024*1024*6  10314

1024*1024*7  9741

1024*1024*8  10158

1024*1024*100 13737

1024*1024*200 14243

1024*1024*400  14134

1024*1024*2000 16051

可以发现一个非常有趣的问题  如何选择缓存字节数的大小,当缓存为5M 时速度最快,当缓存大于5M 小于 6M 时他再次增大,当达到6M 到7M 再次减小 当达到8M后 到2G 速度都在增大

这其中蕴含着什么道理呢?

硬盘读写测试工具上的数据,可以看到他的读取速度达到 1200M/s  我们的Java程序

要比他慢一些 8663/9.5 ≈ 910M ,而实际上读取最高速度应该大于 910M

如图,JAVA 按5M 跑读取程序 瞬时 读取速度 大于1GB/s

硬盘读写他是一个非常复杂的过程,包括了读写单文件,小文件,大文件,多个文件等等

硬盘读写测试软件上的连续读写文件和读单个文件 如何实现他的seq  多个队列连续写我还没有

搞明白希望大神赐教。硬盘读写测试软件是否用真正的文件做测试还是读取硬盘的内容,即用

汇编跳过操作系统,我不得而知。我能想到的Java程序,读写文件加快性能的办法只有,避免文件

过多,那样会浪费时间,多个文件如果数量大非常大巨大庞大 那么应该尽量组合起来,第二个就

是我们现在讨论的设置合理的缓存读取文件。

科技发展的今天,日新月异。笔者的笔记本 硬盘是SSD+HDD 的混合硬盘,联想 thinkpad E490 

网上可以查到他的配置,实际上根本不是混合硬盘,混合硬盘是指大的机械硬盘内部封装了一个

固态硬盘做缓存。而联想这个品牌是独立的SSD 硬盘当然容量只有 128G 用它来做系统盘,完全

足够了。很多的网站有误人子弟的嫌疑,而联想本身的网站上对这个品牌的描述也从来没有混合硬

盘的字样,应该是双硬盘,一个固态硬盘,一个机械硬盘。

以前,我们尽量要软件不装到系统盘,笔者做的测试以前用D盘 也就是机械盘,千差万别的体验啊!!!!

童鞋们一定要看好自己的配置,让性能更好的发挥出来,固态硬盘笔者现在已经到 nvme 4 (2019)了,好的硬盘速度达到了  3000M/s,笔者这个联想品牌只支持 nvme.2280

接口只支持 pcie 3.0×2 (截止2021.6 只有少数笔记本支持pcie 3.0×4)

参数里 笔者比较本 理论最大读取 1500M 写入速度最大 800M (笔者的笔记本貌似写入速度有些问题)

而一个程序的读写性能影响它的因素太多了,温度,操作系统环境等等(我怀疑硬盘读写测试软件 根本没通过操作系统读写文件)

确保能正常工作甚至独占大部分资源的情况下 ,正确选择更容易设置的选项,

应该是我这样的伪程序员的选择。

我们现在继续分析 为什么设置 1024*1024*5  这个参数或者 设置 1024*1024*7 能达到更好的性能。我的猜测如下 笔者这个联想品牌笔记本 e490  CPU如下

二级缓存 为 4*256  =1M 三级缓存 为6M  逻辑处理器为 8 

所以有了程序测试的表现  当缓存 5M<6M 的时候 表现最好  或者当缓存 7M <8*1M 时表现也可以

当一个java 程序读入文件,CPU 如下

也就是说一个CPU 的8个逻辑处理器都响应了

还有一个有趣的 地方就是缓存 设置刚好5M 和 1024*1200*5 的表现如何?结果:10164 

结论(当然这个结论是我猜的) 读入文件缓存应该是二级缓存的倍数,应该刚刚小于三级缓存

或者 刚刚小于 二级缓存乘以逻辑处理器数(百度了一下这个逻辑处理器其实就是核心模拟的)

猜测 操作系统会占用一部分导致 不能刚刚好就是三级缓存或者 二级缓存乘以逻辑处理器数

也想不出如何让程序独占全部的资源,毕竟程序依托操作系统运行啊,可能纯汇编能做到吧

(如果有大神有这方面的心得强烈要求留言,我觉得这方面非常非常有用。)

至于其中原理,什么L1,L2,L3 了内存运作模式啊 命中率啊 什么的,我看了就过了 完全看不懂

或者完全不知道怎样利用。

以上纯属我的个人猜测,强烈要求各路大神指正  留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值