gpt4 book ai didi

java - 为什么 foreach lambda 比其他 for 循环慢这么多?

转载 作者:行者123 更新时间:2023-12-03 17:05:14 25 4
gpt4 key购买 nike

我有需要遍历的列表。我使用的是 Java 8 中的新 foreach。我发现它比旧的不够优雅的方法慢得多。我读过 this堆栈讨论更侧重于最佳实践,而不是现实世界的实现。我知道 lambda 有额外的开销源于方法传递,但我仍然不明白第一种情况和第三种情况之间的差异,这让我觉得我可能用错了。是否还没有针对 lambda 实现优化,或者是否有更好的方法可以使用它们来获得更高的性能?下面是一个演示示例,而不是我的实际代码。

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Main {
public static void main(String[] args) {

List<Memes> memesList =
Arrays.asList(
new OldMemes(),
new TrendingMemes()
);

//----------------------------Benchmark
long start, end;
start = System.nanoTime();
System.out.format("for each started @%d\n", start);
//Old way.
for(Memes memes : memesList){
memes.showMeme();
}
//-----------------------------Benchmark
end = System.nanoTime();
System.out.println((end - start));
start = System.nanoTime();
System.out.format("for started @%d\n", start);
//Other way
for(Iterator<Memes> i = memesList.iterator(); i.hasNext(); ) {
i.next().showMeme();
}
//-----------------------------Benchmark
end = System.nanoTime();
System.out.println((end - start));
start = System.nanoTime();
System.out.format("for each lambda started @%d\n", start);

//New way.
memesList.forEach((memes) -> memes.showMeme());

//-----------------------------Benchmark
end = System.nanoTime();
System.out.println((end - start));
System.out.format("end @%d\n", end);
}
interface Memes {
public void showMeme();
}

static class OldMemes implements Memes {

@Override
public void showMeme() {
System.out.println("Id appetere senserit his, nonumes consulatu vel id.");
}

}

static class TrendingMemes implements Memes {

@Override
public void showMeme() {
System.out.println("Id appetere senserit his, nonumes consulatu vel id.");
}
}
}

最佳答案

您的基准非常错误。对于这两种技术,您只需应用一个循环(只有两个元素)。你应该至少重复一万亿次。同时增加数组的大小,使用至少 50 个元素。接下来,不要在基准测试时打印到标准输出。这需要太多时间,并且是同步操作,会给出错误的结果。

阅读本主题以获得更好的结果:How do I write a correct micro-benchmark in Java?

关于java - 为什么 foreach lambda 比其他 for 循环慢这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20903149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com