RFR: 8273140: Replace usages of Enum.class.getEnumConstants() with Enum.values() where possible
Joe Darcy
darcy at openjdk.java.net
Mon Aug 30 17:57:31 UTC 2021
On Mon, 30 Aug 2021 14:26:56 GMT, Сергей Цыпанов <github.com+10835776+stsypanov at openjdk.org> 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
src/java.desktop/share/classes/sun/font/AttributeValues.java line 2:
> 1: /*
> 2: * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.
Per OpenJDK conventions, the original copyright year must be preserved when a file is updated so
"Copyright (c) 2004, 2021,"
in this case.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5303
More information about the core-libs-dev
mailing list