通过链式操作快速降低流吞吐量?

Mat*_*ias 5 java throughput java-stream

我期望简单的中间流操作,例如limit(),开销很小.但这些示例之间的吞吐量差异实际上很重要:

final long MAX = 5_000_000_000L;

LongStream.rangeClosed(0, MAX)
          .count();
// throughput: 1.7 bn values/second


LongStream.rangeClosed(0, MAX)
          .limit(MAX)
          .count();
// throughput: 780m values/second

LongStream.rangeClosed(0, MAX)
          .limit(MAX)
          .limit(MAX)
          .count();
// throughput: 130m values/second

LongStream.rangeClosed(0, MAX)
          .limit(MAX)
          .limit(MAX)
          .limit(MAX)
          .count();
// throughput: 65m values/second
Run Code Online (Sandbox Code Playgroud)

我很好奇:快速降低吞吐量的原因是什么?它是链式流操作或我的测试设置的一致模式吗?(到目前为止我没有使用JMH,只是用秒表设置快速实验)

Joo*_*gen 4

limit将导致由流组成的切片,带有分割迭代器(用于并行操作)。一言以蔽之:效率低下。这里的空操作开销很大。连续两次limit调用会导致两个切片,这是一种耻辱。

您应该看一下 的实现IntStream.limit

由于 Streams 还相对较新,优化应该放在最后;当生产代码存在时。做极限3次似乎有点牵强。