On Tue, 31 Aug 2021 20:04:23 GMT, Сергей Цыпанов
<[email protected]> wrote:
>> 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
>
> Сергей Цыпанов has updated the pull request incrementally with one additional
> commit since the last revision:
>
> 8273140: Fix copyright year
Lgtm.
-------------
Marked as reviewed by tschatzl (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/5303