今天做了一下测试,利用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 了内存运作模式啊 命中率啊 什么的,我看了就过了 完全看不懂
或者完全不知道怎样利用。
以上纯属我的个人猜测,强烈要求各路大神指正 留言。