首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并行流处理时间不匹配

Java并行流处理时间不匹配
EN

Stack Overflow用户
提问于 2020-08-03 20:13:06
回答 1查看 78关注 0票数 0

在我的windows机器上,我有6个内核。

我创建了一个24个元素的流,并使用stream API中的map操作对每个元素执行一个操作。我利用了并行性:

代码语言:javascript
复制
myCollection.parallelStream()
                    .map(element -> someTimeConsumingOperation(element)
                    .collect(toList());

someTimeConsumingOperation使用以下命令模拟长操作:

代码语言:javascript
复制
Thread.sleep(2000);

myCollection有24个元素。据我所知,streams使用默认的ForkJoinPool executor来并行运行操作,这反过来又会考虑核心的数量,以确定池中有多少线程。

因为有6个核心,所以我假设最多创建6个线程。如果是这种情况,并且每个操作几乎需要2秒,那么整个流处理必须花费大约8秒(每个线程将执行4个操作,因为我们有24个元素要处理,因此是4*2秒)。

但我观察到处理过程只需要4秒。

EN

回答 1

Stack Overflow用户

发布于 2020-08-05 05:25:11

您的6核英特尔处理器已启用HyperThreading。使用HT,操作系统和应用程序将每个CPU核心视为两个独立的“逻辑核心”或“线程”(术语各不相同)。这意味着ForkJoinPool将使用12个线程,而不是6个。

“逻辑核心”彼此之间共享一些资源,因此并行运行12个任务不会提供两倍于运行6个任务的吞吐量。但是,只调用sleep()的程序不会知道其中的区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63229200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档