On Mon, 30 Aug 2021 14:26:56 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
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