0

我最近转而为 Java 8 开发我的软件,我一直在慢慢改进我对 Java 8 的使用并熟悉 Java 8,在这样做的过程中,我开始实现越来越多的功能接口,最近 NetBeans 已经开始建议我将一些 for 循环换成功能接口,但从程序运行的方式来看,它似乎比简单地使用 for 循环慢得多(分别为 1.9 秒运行时与 0.9 秒)。所以我的问题是——是否值得使用功能接口代替 for 循环?一般来说,什么时候应该使用功能接口?功能接口在其他方面是否更有效?提前致谢。

4

1 回答 1

2

如果您的 lambdas 不使用很多捕获变量,那么我相信性能将更接近标准 for 循环。使用 lambda 的优点是更容易并行化(尽管对于有序流,这可能会导致性能降低),并且语法更易于阅读。还要注意,热点编译器会随着时间的推移改变结果(你的第一个循环执行很可能比你的最后一个慢)。

我不知道具体情况,但在最坏的情况下,您的 lambda 可能会被实现为匿名类。在最好的情况下,它只是一个 MethodHandle。

快速测试:

public class Test {

    public static void main(String... args) {
        Random r = new Random(42);
        for(int i = 0; i < 10; i++) {
            testFor();
            testLambda();
        }
    }

    protected static final int TestLength = 1024 * 1024 * 16;

    protected static int result;

    protected static void testFor() {
        Random r = new Random(42);
        long start = System.currentTimeMillis();
        for(int i = 0; i < TestLength; i++) {
            result = r.nextInt(TestLength);
        }
        long end = System.currentTimeMillis();
        System.out.printf("testFor = %dms%n", end - start);
    }

    protected static void testLambda() {
        Random r = new Random(42);
        IntStream stream = IntStream.iterate(0, i -> r.nextInt(1024 * 1024));
        long start = System.currentTimeMillis();
        stream.limit(TestLength).forEach(i -> {result = i;});
        long end = System.currentTimeMillis();
        System.out.printf("testLambda = %dms%n", end - start);
    }

}

结果:

testFor = 209ms
testLambda = 207ms
testFor = 210ms
testLambda = 206ms

对于并行流,结果实际上更慢(在我的机器上大约是 2 倍),因为与正在完成的工作相比,流是有序的并且每个线程都有很多同步开销(只是result = i

于 2014-01-03T01:10:45.463 回答