Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8273140

Replace usages of Enum.class.getEnumConstants() with Enum.values() where possible

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Fixed
    • Icon: P4 P4
    • 18
    • None
    • core-libs
    • None
    • b14

      There are some places in JDK code base where we call Enum.class.getEnumConstants() to get all the values of the enum. This is excessive, less-readable and slower than just calling values() method as in getEnumConstants() we have a 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

            stsypanov Sergey Tsypanov
            stsypanov Sergey Tsypanov
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: