首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8流操作是否被缓存?

Java8流操作是否被缓存?
EN

Stack Overflow用户
提问于 2016-10-17 10:58:17
回答 1查看 782关注 0票数 2

我在用Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz (2 CPUs), ~2.7GHz运行的个人电脑中运行了下面的示例代码

代码语言:javascript
复制
    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));
    }

其输出

代码语言:javascript
复制
  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返回不同的值,但是所花费的时间几乎等于后续的运行,而不是第一次运行。

见下文

代码语言:javascript
复制
  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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-17 11:02:31

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

不,为实现lambda而生成的代码和加载的类都是缓存的。

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

流没有特殊的缓存。

有时findAny返回不同的值,但是所花费的时间几乎等于后续的运行,而不是第一次运行。

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

顺便说一句,在代码至少运行了10,000次之后,才会真正优化编码。在计时之前,我会反复运行这个测试大约10秒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40084636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档