- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
阅读关于 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);
}
}
结果
哪里错了?
我只是想了解是否存在特定阈值,低于该阈值时,普通递归比 ForkJoinPool 更快。
最佳答案
生活中没有免费的东西。如果您必须将一个啤酒箱从您的汽车移动到您的公寓 - 哪个更快:手动将其运送到那里,或者先去棚屋,让手推车用它来移动那个箱子?
创建线程对象是一种“ native ”操作,它会进入底层操作系统以获取那里的资源。这可能是一个相当昂贵的操作。
意思是:仅仅在一个问题上投入“更多线程”并不会自动加快速度。与此相反的。当您的任务主要是 CPU 密集型任务时,并行执行任务可能会带来很小的 yield 。当您进行大量 IO 时,拥有多个线程可以让您总体上“减少”等待;从而提高您的吞吐量。
换句话说:Fork/Join 需要相当多的 Activity 才能完成真正的工作。将它用于只需要几毫秒的计算简直是矫枉过正。因此:您会寻找适用于更大数据集的“fork/join”操作。
要进一步阅读,您可以查看 parallel streams .那些在幕后使用 fork/join 框架;令人惊讶的是,期望任意 parallelStream
也比普通流“更快”是一种误解。
关于java - ForkJoinPool 与普通递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43433874/
在我的代码中,我有一个包含静态最终变量的类 private static final ForkJoinPool pool = new ForkJoinPool(availableCPUs - 1);
为什么要为 Scala fork ForkJoinPool? 哪种实现方式和哪种情况更受欢迎? 最佳答案 scala 库拥有自己的 ForkJoinPool 副本的明显原因是 scala 必须在 1.
这个问题在这里已经有了答案: scala.concurrent.forkjoin.ForkJoinPool vs java.util.concurrent.ForkJoinPool (1 个回答)
相关:CompletableFuture on ParallelStream gets batched and runs slower than sequential stream? 我正在研究通过
我正在使用 ForkJoinPool 调查应用程序中的一些性能问题。我们已经与 Dynatrace 进行了合作,有迹象表明一些阻塞操作持续时间太长。我在 FJP 文档或其他地方找不到足够的信息来了解如
嗨,我是 Java 并发的新手,我正在尝试通过 fork join 并将任务分成多个部分来使列表内容加倍。任务已完成,但结果从未到达。 package com.learning; import jav
我是 Java 的新手,正在尝试学习 fork/join 框架。我在网上看到下面的代码,但是,在我运行代码之后,输出似乎是乱序的。所以我只是想知道是否有任何方法可以打印出每个工作线程的 ID?输出非常
我从未使用过 ForkJoinPool,但我偶然发现了这段代码。 我有一个 Set docs .文档有一个写方法。如果我执行以下操作,是否需要 get 或 join 以确保集合中的所有文档都已正确完成
我正在尝试使用 Java 流和 ForkJoinPool 并行化 for 循环,以控制使用的线程数。当使用单线程运行时,并行代码返回与顺序程序相同的结果。顺序代码是一组标准的 for 循环: for(
我正在使用 fork/join 编写 Java 多线程程序。当我调用 fork/join pool 两次时,它只会执行一次,为什么? public class Test extends Recursi
我正在比较测试程序的两个变体。两者都使用 4 线程运行 ForkJoinPool在具有四个内核的机器上。 在“模式 1”中,我使用池非常像执行程序服务。我将一堆任务扔到 ExecutorService
我想了解在 Java fork-join 池中处理任务的顺序。 到目前为止,我在文档中找到的唯一相关信息是关于一个名为“asyncMode”的参数,“如果此池对 fork 任务使用本地先进先出调度模式
演示问题的简单测试: package com.test; import java.util.ArrayList; import java.util.List; import java.util.con
阅读关于 ForkJoinPool 后,我尝试了一个实验来测试与普通递归相比,ForkJoinPool 的实际速度有多快。 我递归地计算了一个文件夹中的文件数量,令我惊讶的是,普通递归比 ForkJo
我刚刚在取消 ForkJoinPool 返回的 Future 时注意到以下现象.给定以下示例代码: ForkJoinPool pool = new ForkJoinPool(); Future fut
ForkJoinPool 是Java 7 中引入的 fork/join 框架的核心之一。它解决了一个常见的问题: 如何在递归中生成多个任务。因为,即使是使用一个简单的 ThreadPoolExecut
我想在 Java 8 中尝试 ForkJoinPool,所以我编写了一个小程序来搜索给定目录中名称包含特定关键字的所有文件。 程序 : public class DirectoryService {
我已经从'org.codehaus.gpars:gpars:1.0.0'更新为'org.codehaus.gpars:gpars:1.1.0'。我的代码在1.0.0中可以正常工作,但是在1.1.0版中
我的代码中有 parallelStreams(),它使用 ForkJoinPool . 线程池执行器有 4 个预定义的处理程序策略,我想知道公共(public)池中默认使用哪一个(如果有的话)。我在文
我有如下 Java 代码: Stream stream = getStreamFromSomewhere() ForkJoinPool pool = new ForkJoinPool(32); poo
我是一名优秀的程序员,十分优秀!