Integrated: 8273140: Replace usages of Enum.class.getEnumConstants() with Enum.values() where possible
Сергей Цыпанов
github.com+10835776+stsypanov at openjdk.java.net
Thu Sep 2 08:13:37 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
This pull request has now been integrated.
Changeset: 152e6692
Author: Sergey Tsypanov <sergei.tsypanov at yandex.ru>
Committer: Thomas Schatzl <tschatzl at openjdk.org>
URL: https://git.openjdk.java.net/jdk/commit/152e66923dc36cfd83cdfe18e96631abc06b9199
Stats: 13 lines in 4 files changed: 0 ins; 2 del; 11 mod
8273140: Replace usages of Enum.class.getEnumConstants() with Enum.values() where possible
Reviewed-by: tschatzl
-------------
PR: https://git.openjdk.java.net/jdk/pull/5303
More information about the hotspot-gc-dev
mailing list