近日需要写一个md5的文件校验。想测试一下使用FileChannel 和FileInputStream 的读取速度区别。
使用fileinputstream
in=new FileInputStream(file); byte[] buffer=new byte[65536]; messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); int rv=0; while((rv=in.read(buffer))>0) { // messageDigest.update(buffer,0,rv); }
使用filechannel
in=new FileInputStream(file); FileChannel ch=in.getChannel(); messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); ByteBuffer buffer=ByteBuffer.allocate(65536); while(ch.read(buffer)>0) { buffer.flip(); // messageDigest.update(buffer); buffer.clear(); }
测试机器:thinkpad w520,i7 2860QM 2.5Ghz 4c8t,32G内存其中12G作为ramdisk
测试使用lol的客户端安装文件,大概3.16G。
注释掉关于md5计算的部分。读取文件filechannel使用1419ms,(但是第二次测试居然84108ms),fileinputstream使用1149ms。第二次测试依旧1127ms
开启messageDigest的计算filechannel使用12380ms,fileinputstream使用12999ms。
再测试使用我系统盘的ghost文件,大概15.9G。注释掉关于md5计算的部分。读取文件filechannel使用397307ms,fileinputstream使用396798ms。开启messageDigest的计算filechannel使用400456ms,fileinputstream使用397002ms。另外对测试了一个100字节的读取10000次,fc使用1182ms,inputstream 752ms,带md5计算1135ms,inputstream 636ms9.57M的mp3读取10000次
fc: 30952ms,inputstream 32376ms
带md5计算 fc:358514ms,inputstream 363194ms
本文对比了使用FileChannel和FileInputStream进行MD5文件校验时的读取速度,包括注释MD5计算部分和开启MD5计算两种情况下的性能测试。

4165

被折叠的 条评论
为什么被折叠?



