Прочитав о ForkJoinPool, я попытался провести эксперимент, чтобы проверить, насколько быстро работает ForkJoinPool
по сравнению с простой рекурсией.
Я рекурсивно подсчитал количество файлов в папке, и, к моему удивлению, обычная рекурсия работала намного лучше, чем ForkJoinPool
Вот мой код.
Рекурсивная задача
class DirectoryTask extends RecursiveTask<Long> {
private Directory directory;
@Override
protected Long compute() {
List<RecursiveTask<Long>> forks = new ArrayList<>();
List<Directory> directories = directory.getDirectories();
for (Directory directory : directories) {
DirectoryTask directoryTask = new DirectoryTask(directory);
forks.add(directoryTask);
directoryTask.fork();
}
Long count = directory.getDoumentCount();
for (RecursiveTask<Long> task : forks) {
count += task.join();
}
return count;
}
}
Простая рекурсия
private static Long getFileCount(Directory directory) {
Long recursiveCount = 0L;
List<Directory> directories = directory.getDirectories();
if (null != directories) {
for (Directory d : directories) {
recursiveCount += getFileCount(d);
}
}
return recursiveCount + directory.getDoumentCount();
}
Объект каталога
class Directory {
private List<Directory> directories;
private Long doumentCount = 0L;
static Directory fromFolder(File file) {
List<Directory> children = new ArrayList<>();
Long documentCount = 0L;
if (!file.isDirectory()) {
throw new IllegalArgumentException("Only directories are allowed");
}
String[] files = file.list();
if (null != files) {
for (String path : files) {
File f = new File(file.getPath() + File.separator + path);
if (f.isHidden()) {
continue;
}
if (f.isDirectory()) {
children.add(Directory.fromFolder(f));
} else {
documentCount++;
}
}
}
return new Directory(children, documentCount);
}
}
Результаты
- Обычная рекурсия: 3 мс
- ForkJoinPool: 25 мс
Где здесь ошибка?
Я просто пытаюсь понять, существует ли определенный порог, ниже которого простая рекурсия работает быстрее, чем ForkJoinPool.