Java8流操作是否缓存?

我在运行Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz (2 CPUs), ~2.7GHz PC上运行以下示例代码

  String format = "%7s run taken %6d micro seconds %5d findAny"; // First run long start = System.nanoTime(); int rand = IntStream.range(0, 100000).parallel().findAny().getAsInt(); long end = System.nanoTime(); System.out.println(String.format(format, "First", ((end - start) / 1000), rand)); // Subsequent runs for (int i = 0; i < 25; i++) { start = System.nanoTime(); rand = IntStream.range(0, 100000).parallel().findAny().getAsInt(); end = System.nanoTime(); System.out.println(String.format(format, "Subseq", ((end - start) / 1000), rand)); } 

它的输出

  First run taken 92532 micro seconds 50000 findAny Subseq run taken 61 micro seconds 50000 findAny Subseq run taken 37 micro seconds 50000 findAny Subseq run taken 52 micro seconds 50000 findAny Subseq run taken 42 micro seconds 50000 findAny Subseq run taken 33 micro seconds 50000 findAny Subseq run taken 32 micro seconds 50000 findAny Subseq run taken 34 micro seconds 50000 findAny Subseq run taken 33 micro seconds 50000 findAny Subseq run taken 34 micro seconds 50000 findAny Subseq run taken 32 micro seconds 50000 findAny Subseq run taken 32 micro seconds 50000 findAny Subseq run taken 46 micro seconds 50000 findAny Subseq run taken 36 micro seconds 50000 findAny Subseq run taken 31 micro seconds 50000 findAny Subseq run taken 43 micro seconds 50000 findAny Subseq run taken 34 micro seconds 50000 findAny Subseq run taken 31 micro seconds 50000 findAny Subseq run taken 32 micro seconds 50000 findAny Subseq run taken 37 micro seconds 50000 findAny Subseq run taken 45 micro seconds 50000 findAny Subseq run taken 49 micro seconds 50000 findAny Subseq run taken 32 micro seconds 50000 findAny Subseq run taken 31 micro seconds 50000 findAny Subseq run taken 31 micro seconds 50000 findAny Subseq run taken 37 micro seconds 50000 findAny 

我们可以看到第一次和后续运行之间的时间差异。

  1. 是否意味着流操作被缓存? 在Java8是否为流实现了任何内部缓存?
  2. 有时findAny返回不同的值,但所用的时间几乎等于后续的运行,而不像第一次运行

见下文

  First run taken 84099 micro seconds 50000 findAny Subseq run taken 163 micro seconds 25000 findAny Subseq run taken 46 micro seconds 50000 findAny Subseq run taken 52 micro seconds 25000 findAny 

是否意味着流操作被缓存?

不,为实现lambdas而生成的代码以及加载的类都是缓存的。

在Java8中是否为流实现了任何内部缓存?

Streams没有特殊的缓存。

有时findAny会返回不同的值,但所用的时间几乎等于后续的运行,而不像第一次运行

确实。 没有关于结果的任何内容被缓存。 您第一次为加载代码支付罚金。

BTW编码在运行至少10,000次之前并未真正优化。 在计时之前,我会反复运行这个测试大约10秒钟。