全部!
我正试图找到一种更快的方法来计算大型文件的MD5和,以识别出于个人目的的重复项。
我正在使用Timothy Macintha快速哈希实现(here)来完成工作。
在将md5总和应用于每个文件时,我尝试了三种不同的方法:遍历集合,使用流和使用parallelStream。
我发现,在带有大文件的小型设备上,并行方法在很大程度上远远优于其他两个方法。
但是,如果文件集很大且文件较小,则传统方法和流方法要快得多。
并行方法的性能变化是否有原因?
将md5和存储在新集中是否会对列出的任何方法产生不利影响?
我用于三种方法的代码如下:
private static long applyHash(Set<File> files) {
Long start = System.currentTimeMillis();
files.stream()
.forEach(file -> {
try {
MD5.asHex(MD5.getHash(file));
} catch (IOException e) {
e.printStackTrace();
}
});
Long end = System.currentTimeMillis();
return (end - start);
}
private static long applyParallelHash(Set<File> files) {
Long start = System.currentTimeMillis();
files.parallelStream()
.forEach(file -> {
try {
MD5.asHex(MD5.getHash(file));
} catch (IOException e) {
e.printStackTrace();
}
});
Long end = System.currentTimeMillis();
return (end - start);
}
private static long applyConventionalHash(Set<File> files) {
Long start = System.currentTimeMillis();
for (File file:files) {
try {
MD5.asHex(MD5.getHash(file));
} catch (Exception e) {
e.printStackTrace();
}
}
Long end = System.currentTimeMillis();
return (end - start);
}
我查看了您提到的MD5库的源代码,据了解,MD5.getHash使用旧io api(FilterInputStream)的阻塞操作,这在处理并行流时会导致性能下降。
[为了更好地理解,请查看https://dzone.com/articles/java-nio-vs-io中的“阻塞与非阻塞IO”部分