Все!
Я пытаюсь найти более быстрый метод вычисления суммы MD5 большого набора файлов, чтобы идентифицировать дубликаты для личных целей.
Я используя Timothy Macintha fast ha sh реализацию ( здесь ), чтобы выполнить работу.
Я пробовал три разных подхода при применении суммы md5 к каждому файлу: перебор набора с использованием потока и с использованием parallelStream.
Что я обнаружил, так это то, что на небольшом наборе с большими файлами параллельный подход превосходит два других по большому и дальнему.
Но, если набор очень большие с небольшими файлами, обычный и потоковый подходы намного быстрее.
Результаты (в миллисекундах на файл для каждого подхода) можно увидеть ниже: ![inof](https://i.stack.imgur.com/wrKDR.png)
Есть ли причина изменения производительности для параллельного подхода?
Может ли сохранение сумм md5 в новом наборе отрицательно повлиять на любой из перечисленных подходов?
Код I «м Для трех подходов используются следующие:
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);
}