gpt4 book ai didi

java - 为什么 System.out::println 比 Java 8 中的匿名类实现慢?

转载 作者:行者123 更新时间:2023-12-01 06:49:46 25 4
gpt4 key购买 nike

我正在使用一些 Java 8 Stream蜜蜂。我很困惑看到以下两个解决方案之间的性能差异,它们只是打印 Stream 的内容。

解决方案 1:

int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
start = System.nanoTime();
Arrays.stream(array).forEach(System.out::println);
System.out.println((System.nanoTime() - start) / 1000000.0f);

解决方案 2:

int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
start = System.nanoTime();
Arrays.stream(array).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
System.out.println((System.nanoTime() - start) / 1000000.0f);

为了执行,解决方案 1 大约需要花费时间。比解决方案 2 多出 5-6 倍的时间。

系统配置:

  • JRE:1.8.0_101 64 位
  • 操作系统:Windows 10 家庭版 64 位
  • 内存:4 GB
  • IDE:适用于 Java EE 64 位的 Eclipse Mas-1

如果有人能解释一下为什么会有如此巨大的差异?

JMH 代码:

public class MyBenchmark {

@Benchmark
public void solution_0() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);asdasdas
}
}

@Benchmark
public void solution_1() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
Arrays.stream(array).forEach(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
}

@Benchmark
public void solution_2() {
int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
Arrays.stream(array).forEach(System.out::println);
}
}

最佳答案

您正在测量方法引用的实例化,而不是其运行时性能。

第一次使用方法引用(System.out::println)时,JVM 需要创建一个实现 IntConsumer 接口(interface)的内部类。当然,这需要时间。尽管这在应用程序生命周期内只执行一次。

在第二种情况下,您自己创建了这样的匿名类。

如果您希望测量方法引用的运行时性能,则必须修改基准测试方法。请参阅“How do I write a correct micro-benchmark in Java?

关于java - 为什么 System.out::println 比 Java 8 中的匿名类实现慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947622/

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