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
我们可以看到第一次和后续运行之间的时间差异。
- 是否意味着流操作被缓存? 在
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
是否意味着流操作被缓存?
不,为实现lambdas而生成的代码以及加载的类都是缓存的。
在Java8中是否为流实现了任何内部缓存?
Streams没有特殊的缓存。
有时findAny会返回不同的值,但所用的时间几乎等于后续的运行,而不像第一次运行
确实。 没有关于结果的任何内容被缓存。 您第一次为加载代码支付罚金。
BTW编码在运行至少10,000次之前并未真正优化。 在计时之前,我会反复运行这个测试大约10秒钟。
- mvn install vs jar:jar
- JTable隐藏和显示列
- 如何通过Java代码影响System.loadLibrary()的搜索路径?
- 两个不同JFrame之间的通信?
- 获取java.lang.ClassNotFoundException:JUnit中的javax.servlet.ServletContext
- 使用IntelliJ Idea进行持续测试
- 除了使用集成测试运行器在IntelliJ IDEA项目中以“IntegrationTest”结尾的所有JUnitunit testing之外,我该如何运行?
- 具有有界扩展枚举参数的通用方法 – 无法访问values()方法
- 提高网络编码编码的性能