gpt4 book ai didi

java - enums value() 方法和 class.getEnumConstants() 的比较

转载 作者:行者123 更新时间:2023-12-02 04:19:54 34 4
gpt4 key购买 nike

我试图比较这两种实现枚举值的方法(有反射和没有反射)。

这是我的测试类:

public class ReflectionOnEnumsTests2 {

enum TestEnum { ONE, TWO, THREE; }

public static void main(String[] args) {
long n = 600_000_000;
int stub;

//test without Reflection
long timeStartWithoutReflection = System.currentTimeMillis();
for (int i = 0; i < n; i++){
TestEnum[] values = TestEnum.values();
stub = values.length;
}
System.out.println("Time consuming with reflection: " + (System.currentTimeMillis() - timeStartWithoutReflection));

//test Reflection
long timeStartWithReflection = System.currentTimeMillis();
for (int i = 0; i < n; i++){
TestEnum[] values = TestEnum.class.getEnumConstants();
stub = values.length;
}
System.out.println("Time consuming with reflection: " + (System.currentTimeMillis() - timeStartWithReflection));
}
}

我对测试结果感到困惑。消耗的时间大致相同。我预计 class.getEnumConstants 会比 value() 方法慢得多。

结果:
反射耗时:6050
反射耗时:7483

JDK版本:1.8.0_60

问题:
那么为什么性能没有差异呢?

最佳答案

So why there is no difference in performance?

您自己的测试表明,非反射方法的速度大约快 20%。这可能没有您预期的那么多,但这是一个不小的差异。

事实上,无论如何都很难概括你的结果。 Java 的性能测试很棘手。 JIT 编译尤其可能导致诸如您的综合基准测试产生仅代表其自身的结果,并且不能准确地描述实际应用程序环境中预期的性能。

无论如何,您提出的比较这两种方法的标准是错误的。您应该尽可能使用普通的非反射方法,因为它提供了更好的 API,即使性能差异只是中等。使用反射的唯一原因是,在运行时之前您无法了解足够的信息来确定要采取的操作的详细信息。这种情况很少见。

关于java - enums value() 方法和 class.getEnumConstants() 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907575/

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