gpt4 book ai didi

Java 8 forEach 循环需要很多时间,为什么?

转载 作者:行者123 更新时间:2023-11-30 08:01:36 26 4
gpt4 key购买 nike

我有一个大约 3483 对象的 ArrayList 准备合并到数据库中。当我使用 lambda 表达式时 - 它需要 85122 毫秒。但是 for(Obj o : list) 只需要 25 毫秒。为什么 Java8 花费 3404 倍的时间?

List<CIBSubjectData> list1 = .....

list1.forEach(data ->
merge(data)
);

for (CIBSubjectData data : list1) {
merge(data);
}

最佳答案

我相信您没有使用正确的微基准设置。您正在比较 bytecode instrumentation framework(ASM,用于在runtime 生成 lambda 字节码)+ lambda 执行时间循环的执行时间.

检查 performance-difference-between-java-8-lambdas-and-anonymous-inner-classes 的答案和链接的文件。链接文档对幕后处理有深入的了解。

编辑提供一个小片段来演示以上内容。

public class Warmup {
static int dummy;

static void merge(String s) {
dummy += s.length();
dummy++;
dummy -= s.length();
}

public static void main(String[] args) throws IOException {
List<String> list1 = new ArrayList<>();
Random rand = new Random(1);

for (int i = 0; i < 100_000; i++) {
list1.add(Long.toString(rand.nextLong()));
}

// this will boostrap the bytecode instrumentation
// Stream.of("foo".toCharArray()).forEach(System.out::println);
long start = System.nanoTime();
list1.forEach(data -> merge(data));

long end = System.nanoTime();
System.out.printf("duration: %d%n", end - start);
System.out.println(dummy);
}
}

如果您按发布的方式运行代码,则在我的机器上打印的持续时间为

duration: 71694425

如果您取消注释行 Stream.of(...(它只是第一次使用字节码检测框架)打印的持续时间是

duration: 7516086

这只是初始运行的 10% 左右。

注意 只是要明确。不要使用像上面那样的基准。看看jmh对于这样的需求。

关于Java 8 forEach 循环需要很多时间,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37435130/

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