Почему параллельный поток 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 Звоните, делая окончательные записи без изменений.

Ответы на вопрос(3)

Ваш ответ на вопрос