阅读ForkJoinPool后,我尝试了一个实验来测试速度有多快实际上ForkJoinPool
是,相比于普通的递归时。ForkJoinPool VS平原递归
我计算出的文件数的文件夹中递归,和我surprize,普通递归执行的方式优于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();
}
Directory对象
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);
}
}
个结果
- 平原递归:3ms的
- ForkJoinPool:25ms的
在哪里,这里的错误?
我只是想了解是否有特定的阈值,低于该普通递归比ForkJoinPool更快。
非常感谢您的澄清。所以,我从这里的答案(Stephen C的一个), 当正在执行的任务实际需要一段时间才能完成时,ForkJoinPool是人为的,以补偿线程创建的开销。 –
正确。除此之外:你还必须小心如何/你的基准。如果您多次重复实验时执行时间发生变化,这并不会让我感到惊讶。 – GhostCat