Just a very tiny clean-up.
There are some places in JDK code base where we call
`Enum.class.getEnumConstants()` to get all the values of the referenced `enum`.
This is excessive, less-readable and slower than just calling `Enum.values()`
as in `getEnumConstants()` we have volatile access:
public T[] getEnumConstants() {
T[] values = getEnumConstantsShared();
return (values != null) ? values.clone() : null;
}
private transient volatile T[] enumConstants;
T[] getEnumConstantsShared() {
T[] constants = enumConstants;
if (constants == null) { /* ... */ }
return constants;
}
Calling values() method is slightly faster:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
public class EnumBenchmark {
@Benchmark
public Enum[] values() {
return Enum.values();
}
@Benchmark
public Enum[] getEnumConstants() {
return Enum.class.getEnumConstants();
}
private enum Enum {
A,
B
}
}
Benchmark Mode Cnt
Score Error Units
EnumBenchmark.getEnumConstants avgt 15
6,265 ± 0,051 ns/op
EnumBenchmark.getEnumConstants:·gc.alloc.rate avgt 15
2434,075 ± 19,568 MB/sec
EnumBenchmark.getEnumConstants:·gc.alloc.rate.norm avgt 15
24,002 ± 0,001 B/op
EnumBenchmark.getEnumConstants:·gc.churn.G1_Eden_Space avgt 15
2433,709 ± 70,216 MB/sec
EnumBenchmark.getEnumConstants:·gc.churn.G1_Eden_Space.norm avgt 15
23,998 ± 0,659 B/op
EnumBenchmark.getEnumConstants:·gc.churn.G1_Survivor_Space avgt 15
0,009 ± 0,003 MB/sec
EnumBenchmark.getEnumConstants:·gc.churn.G1_Survivor_Space.norm avgt 15 ≈
10⁻⁴ B/op
EnumBenchmark.getEnumConstants:·gc.count avgt 15
210,000 counts
EnumBenchmark.getEnumConstants:·gc.time avgt 15
119,000 ms
EnumBenchmark.values avgt 15
4,164 ± 0,134 ns/op
EnumBenchmark.values:·gc.alloc.rate avgt 15
3665,341 ± 120,721 MB/sec
EnumBenchmark.values:·gc.alloc.rate.norm avgt 15
24,002 ± 0,001 B/op
EnumBenchmark.values:·gc.churn.G1_Eden_Space avgt 15
3660,512 ± 137,250 MB/sec
EnumBenchmark.values:·gc.churn.G1_Eden_Space.norm avgt 15
23,972 ± 0,529 B/op
EnumBenchmark.values:·gc.churn.G1_Survivor_Space avgt 15
0,017 ± 0,003 MB/sec
EnumBenchmark.values:·gc.churn.G1_Survivor_Space.norm avgt 15 ≈
10⁻⁴ B/op
EnumBenchmark.values:·gc.count avgt 15
262,000 counts
EnumBenchmark.values:·gc.time avgt 15
155,000 ms
-------------
Commit messages:
- 8273140: Replace usages of Enum.class.getEnumConstants() with Enum.values()
where possible
Changes: https://git.openjdk.java.net/jdk/pull/5303/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5303&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8273140
Stats: 13 lines in 4 files changed: 0 ins; 2 del; 11 mod
Patch: https://git.openjdk.java.net/jdk/pull/5303.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/5303/head:pull/5303
PR: https://git.openjdk.java.net/jdk/pull/5303