Почему параллельный поток Files.list () работает намного медленнее, чем использование Collection.parallelStream ()?
Следующий фрагмент кода является частью метода, который получает список каталогов, вызывает метод извлечения для каждого файла и сериализует полученный объект наркотика в xml.
try(Stream<Path> paths = Files.list(infoDir)) {
paths
.parallel()
.map(this::extract)
.forEachOrdered(drug -> {
try {
marshaller.write(drug);
} catch (JAXBException ex) {
ex.printStackTrace();
}
});
}
Вот точно такой же код, который делает то же самое, но использует простой.list()
позвоните, чтобы получить список каталогов и вызов.parallelStream()
в результирующем списке.
Arrays.asList(infoDir.toFile().list())
.parallelStream()
.map(f -> infoDir.resolve(f))
.map(this::extract)
.forEachOrdered(drug -> {
try {
marshaller.write(drug);
} catch (JAXBException ex) {
ex.printStackTrace();
}
});
Моя машина - четырехъядерный MacBook Pro, Java v 1.8.0_60 (сборка 1.8.0_60-b27).
Я обрабатываю ~ 7000 файлов. Средние 3 прогона:
Первая версия: с.parallel()
: 20 секунд Без.parallel()
: 41 секунда
Вторая версия: с.parallelStream()
: 12 секунд С.stream()
: 41 секунда
Эти 8 секунд в параллельном режиме кажутся огромной разницей, учитывая, чтоextract
метод, который читает из потока и делает всю тяжелую работу иwrite
Звоните, делая окончательные записи без изменений.