我在做什么错java 8 lambda Predicate <Integer>?

这个问题在这里已经有了答案:

  • 我如何在Java中编写正确的微基准测试? 11个答案
  • 拉姆达表演的区别? 3个答案

  • 首先,让我们看看事物的规模。 你谈论的是100000000个物品差异大约1505毫秒,或者说每个物品大约15纳秒。 这种开销不大。

    也就是说,为了Predicate<Integer>的缘故,开销是将所有这些int自动装箱到Integers中。 Predicate::test需要一个Integer ,所以p.test(i)真正被编译为p.test(Integer.valueOf(i)) 。 该方法不是超级昂贵,但它不是免费的。 显然,你的电脑大概需要15纳秒。

    如果你使用一个IntPredicate它使用一个int基元作为它的输入,从而避免了装箱 - 你会发现直接和基于lambda的方法之间的区别实际上已经消失了。

    除此之外,还有关于Java中微基准的常见警告(热身循环,使用JMH等框架)。 关于这个主题有很多知识,如果你想继续对这种快速行为进行基准测试,我强烈建议你阅读它。


    性能和lambda可能会很棘手。 在你的情况下使用包装类型整数和自动装箱减慢东西。

    开关

    public long sumAllLambda(Predicate<Integer> p) 
    

    public long sumAllLambda(IntPredicate p) 
    

    结果几乎相同

    Total execution time conv: 3190
    Total execution time lambda: 3037
    lambda / conv : 0.95203763 
    
    链接地址: http://www.djcxy.com/p/86545.html

    上一篇: What am i doing wrong with java 8 lambda Predicate<Integer>?

    下一篇: Benchmarking in scala