最近在项目中有一个用smb读取共享文件的应用,在部署过程中发现一个奇怪现象,在公司测试时其用时还马马虎虎,虽是有点慢,但还不至于让人无法忍受.但一部署都客户现场,则超级慢.严重影响系统的使用.没办法只能对其进行整改:
1.首先,将所有的for循环检查一遍,能移出去的尽量移出去,并进行不同方法的封装
2.将原有方法中抛出的异常全部捕捉起来,并将所有该关闭的连接全部在finally里面关闭
3.对线程设置timeout,以防止死锁
最后是对程序进行手术,阅读代码才发现原来代码中下载文件用的是:以字节为单位读取文件内容,一次读一个字节这种方式 就是这个原因造成系统运行超慢:
int tempbyte;
while ((tempbyte = ()) != -1) {
(tempbyte);
}
将其稍微改动一下,一次性读入多个字节:
byte[] tempbytes = new byte[1024];
int byteread = 0;
// 读入多个字节到字节数组中,byteread为一次读入的字节数
while ((byteread = (tempbytes)) != -1) {
(tempbytes, 0, byteread);
}
重启运行,原来要近一个小时的下载工作,竟然只用了不到5秒钟,就搞定.
总结:
内存存取时间单位是纳秒级(10E-9),磁盘存取时间单位是毫秒级(10E-3),同样操作一次的开销,内存比磁盘快了百万倍。因此要尽量用缓存流进行读写文件,以减少对磁盘的读取次数.
经只读测试,BufferedReader耗用的时间是RandomAccessFile的10倍以上,FileInputStream耗用的时间是RandomAccessFile的1-2倍,测试读的文件是35M左右,如果文件再大差距更明显.这里后面两个用的是字节byte[] b1=new byte[8*1024],而前面也用的是字符char[] data=new char[8*1024]
注意:如果RandomAccessFile用readLine(),则效果会差很多,耗时会比用字节的慢100多倍.
看来IO读取文件,这里面水还挺深的,有时间明天再整理一下.