我在用Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz (2 CPUs), ~2.7GHz运行的个人电脑中运行了下面的示例代码
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我们可以看到第一次运行和后续运行所花费的时间不同。
Java8中的流实现的内部缓存?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发布于 2016-10-17 11:02:31
这是否意味着流操作被缓存?
不,为实现lambda而生成的代码和加载的类都是缓存的。
是否为Java8中的流实现了任何内部缓存?
流没有特殊的缓存。
有时findAny返回不同的值,但是所花费的时间几乎等于后续的运行,而不是第一次运行。
确实如此。没有缓存任何关于结果的内容。当您第一次为加载代码支付罚款时。
顺便说一句,在代码至少运行了10,000次之后,才会真正优化编码。在计时之前,我会反复运行这个测试大约10秒。
https://stackoverflow.com/questions/40084636
复制相似问题