Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java8中的IntStream.range(0,n)不应该是并行的?_Java_Java 8_Java Stream - Fatal编程技术网

为什么Java8中的IntStream.range(0,n)不应该是并行的?

为什么Java8中的IntStream.range(0,n)不应该是并行的?,java,java-8,java-stream,Java,Java 8,Java Stream,我读过一本关于Java 8的书,书中说使用并行流通过IntStream.range0获得数字范围,有些数字可能比顺序数字慢…为什么呢?它可能慢一些。默认情况下,应始终使用顺序流。与顺序流相比,并行流的开销要高得多,因为它需要大量的内部协调工作以及某些簿记活动 如果你认为: 1.您需要处理大量的项目,每个项目都需要大量的时间,并且可以并行化。 2.如果您首先要解决性能问题。所以,在尝试并行流或任何其他并发构造之前,黄金法则始终是基准测试 在您的情况下,如果范围非常小,那么在这种情况下,与并行流相关

我读过一本关于Java 8的书,书中说使用并行流通过IntStream.range0获得数字范围,有些数字可能比顺序数字慢…为什么呢?

它可能慢一些。默认情况下,应始终使用顺序流。与顺序流相比,并行流的开销要高得多,因为它需要大量的内部协调工作以及某些簿记活动

如果你认为: 1.您需要处理大量的项目,每个项目都需要大量的时间,并且可以并行化。 2.如果您首先要解决性能问题。所以,在尝试并行流或任何其他并发构造之前,黄金法则始终是基准测试


在您的情况下,如果范围非常小,那么在这种情况下,与并行流相关的开销会覆盖您应该获得的好处。也可以查看这篇文章:

无论你从这本书中拿走了什么,都是错误的,或者充其量只是过于简单化了。因为你没有说什么书,我们不知道这本书是错的还是你只是误解了

你是否能得到一个并行的加速是许多事情的函数;源的可拆分性、流上的操作、行为参数所做的工作以及硬件。拥有一个不可丢弃的源肯定会扼杀并行性能;例如,LinkedList不太可能很好地并行化

详细介绍了哪些因素使用并行可能会加快计算速度、降低计算速度,或者两者都不会,以及如何识别流管道的可能并行行为

书或你的解释出错的地方是把责任推到IntStream.range上;它是最好的分裂源之一。因此,如果您有一个并行性不好的管道,这肯定不是因为您使用IntStream.range作为源,但可能是由于其他任何原因,数据太少,终端操作中的合并成本太高,等等


世上没有魔法和灰尘;streams可以让您轻松地编写并行代码,但不能免除您理解并行成本模型的需要。但是,如果有人告诉你IntStream.range是问题所在,我建议你停止听他们的建议——这是非常危险的错误建议。

这在很大程度上取决于场景。处理器上有一个开销来加速并行线程并处理它们。因此,如果您希望运行的进程不需要很多时间,那么这将是CPU周期的浪费

另一方面,我正在编写一个数据生成方法。为此,我使用了并行流,它将性能提高了至少4倍。在我的例子中,每个并行线程负责在数据库中执行多个读写操作,因此每个线程的处理时间相当长

注意:您可以设置属性:java.util.concurrent.ForkJoinPool.common.parallelism。如果您编写的进程依赖于并行线程的数量,这将非常有用。默认情况下。parallel将为每个核心增加一个线程。

在使用parallelStream之前,请阅读以下内容:

它是多线程的。在java中,仅仅编写parallelStream来获得并行性几乎总是一个坏主意。在某些情况下,它会起作用,但并不总是如此。还有其他方法可以实现并行性,而且几乎总是在采用多线程解决方案之前需要考虑很多。 它使用默认的JVM线程池。因此,如果您正在执行任何阻塞操作(如网络调用),整个java应用程序可能会被卡住。这是最大的问题。还有其他的任务分配。具有n个线程的简单ExecutionService提供了比并行流更好的性能。 你也可以阅读:

这应该有帮助。为什么您认为使用更多线程应该更快?据我记忆所及,Java 8正在运行。我假设更多的线程应该更快,因为每个线程都会生成部分数据,并且只有所有部分数据块的组合才会导致一些开销……也许您可以更具体一些。有一整章是关于Java 8中的并行处理的,有几个地方使用了IntStream.range和类似的方法。不要相信你读到的所有东西。@Zombies该示例中的基准比一文不值还要糟糕。数字不仅毫无意义,而且毫无价值,它让你得出了一些不真实的结论,这是最糟糕的部分,因为人类很难看到一个测量数字而不赋予它意义。这个基准并不能衡量你的想法,或者作者的想法。