[OpenJDK 2D-Dev] RFR: 8273140: Replace usages of Enum.class.getEnumConstants() with Enum.values() where possible

Сергей Цыпанов github.com+10835776+stsypanov at openjdk.java.net
Mon Aug 30 14:36:05 UTC 2021


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


More information about the 2d-dev mailing list