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