最近,我转向为Java 8开发我的软件,我一直在慢慢地改进我对Java 8的使用,并对Java 8感到满意,在这样做的过程中,我开始实现越来越多的功能接口,最近NetBeans开始建议我将一些for循环转换为功能接口,但从程序运行的方式来看,它似乎比使用for循环(分别为1.9秒和.9秒)要慢得多。所以我的问题是--用函数接口代替for循环值得吗?一般来说,什么时候应该使用功能接口?功能接口在其他方面是否更有效率?提前谢谢。
发布于 2014-01-03 01:10:45
如果您的lambda不使用许多捕获变量,那么我相信性能将更接近于循环标准。使用lambda的优点是更容易并行化(尽管对于有序流,这可能会导致性能更慢)和更容易读取语法。另外,需要注意的是,hotspot编译器将随着时间的推移而更改结果(您的第一个循环执行很可能比最后一个要慢)。
我不知道具体情况,但在最坏的情况下,您可以将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)。
https://stackoverflow.com/questions/20894069
复制相似问题