当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我在java8lambdaPredicate<Integer>上做错了什么?》经验,为你挑选了1个好方法。

不是我的问题的重复.我检查它和我是如何利用适当的谓词 THAT约为removeIf和删除之间的差异.

我是Java初学者.
昨天,我试着按照这个教程https://dzone.com/articles/why-we-need-lambda-expressions
在我学会了如何使用Lambda表达式和谓词后,我自己制作了代码来练习.
比如,总和所有数字if(n%3 == 0 || n%5 == 0).这是我的代码.

public class Euler1Lambda {
    long max;
    public Euler1Lambda(long max) {
        this.max = max;
    }
public static boolean div3remainder0(int number) {
    return number % 3 == 0;
}

public static boolean div5remainder0(int number) {
    return number % 5 == 0;
}

public long sumAll() {
    long sum = 0;
    for(int i=1; i p) {
    long total = 0;
    for (int i = 1; i< max; i++){
        if (p.test(i)) {
            total += i;
        }
    }
return total;
}

public static void main(String[] args) {
    //conv
    long startTime = System.currentTimeMillis();
    for(int i = 0; i < 10; i++){
        new Euler1Lambda(100000000).sumAll();
    }
    long endTime = System.currentTimeMillis();
    long conv = (endTime - startTime);
    System.out.println("Total execution time: " + conv);
    //lambda
    startTime = System.currentTimeMillis();
    for(int i = 0; i < 10; i++){
        new Euler1Lambda(100000000).sumAllLambda(n -> div3remainder0(n) || div5remainder0(n));
    }
    endTime = System.currentTimeMillis();
    long lambda = (endTime - startTime);
    System.out.println("Total execution time: " + lambda);
    System.out.println("lambda / conv : " + (float)lambda/conv);
}
}

在这段代码中,做了时序测试.结果是这样的.

Total execution time conv: 1761
Total execution time lambda: 3266

lambda / conv : 1.8546281

如您所见,带谓词的lambda表达式比简单的for循环慢.
我不知道为什么结果会这样.
我究竟做错了什么?或者只是谓词太慢的使用方式?



1> yshavit..:

首先,让我们来看看事物的规模.你说的是100000000个项目的差异大约1505毫秒,或者每个项目大约15 纳秒.这个开销不是很大.

尽管如此,开销是自动装箱所有这些ints转换Integers为的缘故Predicate.Predicate::test需要一个Integer,所以p.test(i)真的被编译到p.test(Integer.valueOf(i)).这种方法并不是超级便宜,但它不是免费的.显然,您的计算机需要大约15纳秒.

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

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


我想,在充分预热的情况下,差异将在两种情况下消失,因为执行时间将收敛到零(提示:在所有情况下,整个操作都是无副作用且其结果未在任何地方使用)......
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有