9

我正在实现一个Spliterator通过trySplit()return明确限制并行化的方法null。实施是否会estimateSize()为此拆分器生成的流提供任何性能改进?还是估计的大小仅对并行化有用?

编辑:为了澄清,我特别询问估计大小。也就是说,我的分离器没有这个SIZED特性。

4

2 回答 2

5

查看相关拆分器特征的调用层次结构表明它至少与stream.toArray()性能相关

在此处输入图像描述

此外,内部流实现中还有一个等效标志,似乎用于排序:

在此处输入图像描述

因此,除了并行流操作之外,大小估计似乎也用于这两个操作。

我并没有声称我的搜索详尽无遗,因此仅以这些为例。


如果没有 SIZED 特性,我只能找到estimateSize()与流管道并行执行相关的调用。

当然,这可能会在未来发生变化,或者与标准 JDK 不同的另一种 Stream 实现可能会有所不同。

于 2015-06-07T09:56:05.653 回答
0

拆分器可以遍历元素:

1.个别(tryAdvance()

2.依次批量(forEachRemaining()

根据java docs estimateSize()在拆分过程中会派上用场。

Spliterators 可以通过estimateSize() 方法估计剩余元素的数量。理想情况下,正如 SIZED 特性所反映的那样,该值与成功遍历中将遇到的元素数量完全对应。然而,即使在不完全知道的情况下,估计值仍然可能对在源上执行的操作有用,例如帮助确定进一步拆分或顺序遍历剩余元素是否更可取

由于您的拆分器没有 SIZED 特性 estimateSize,因此不会提供任何性能(因为没有并行性),但是请记住,Java-docs ofestimateSize没有提到任何并行性,它只声明:

返回:估计的大小,或者 Long.MAX_VALUE 如果无限、未知或计算太昂贵。

于 2015-06-07T09:27:00.213 回答