閱讀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