- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图比较这两种实现枚举值的方法(有反射和没有反射)。
这是我的测试类:
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/
此测试用例是为了验证通用枚举生成器。这会生成 xml 文件中列出的枚举。 测试用例是循环遍历生成的每个枚举类并验证枚举常量是否与从 XML 生成的对象匹配。 1. List of Enum const
Java 反射 API 包含一个方法 Class.getEnumConstants()这使得可以确定一个类是否是 enum类(如果它认为该类不是 null ,则返回 enum ),以及它的常量是什么。
将 AspectJ 与枚举一起使用,我得到以下结果: public enum EnumName { B, L, A } EnumName.class.isEnum() : true EnumName.
我试图比较这两种实现枚举值的方法(有反射和没有反射)。 这是我的测试类: public class ReflectionOnEnumsTests2 { enum TestEnum { ONE,
要获取一些 Enum 类型 TestEnum 的 enum 常量数组,我们有两个选择 - TestEnum.values() 或 TestEnum.class.getEnumConstants()。当
我有以下 BeanValidation 代码可以正常工作,并允许验证注释的 bean: @EnumValue(enumClass = MyTestEnum.class) private Str
我是一名优秀的程序员,十分优秀!