On Sun, 2 Oct 2022 22:16:46 GMT, Claes Redestad <[email protected]> wrote:
>> `checkedExceptions` param of `MethodAccessorGenerator.generateMethod()` is
>> unused and should be removed in order to prevent allocations from
>> `Method.getExceptionTypes()`
>
> Seems reasonable, although these generators should only rarely be used when
> doing reflection. I'm curious if you have some test or micro where the
> improvement shows?
@cl4es this code is frequently invoked in Spring-based applications at start-up
time. I couldn't design the benchmark for this particular case, assuming that
in majority of cases `Method.getExceptionTypes()` returns a copy of an empty
array I think we save about 12 ns and 16 bytes:
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(value = Mode.AverageTime)
public class ArrayCloneBenchmark {
private final Object[] array = new Object[0];
@Benchmark
public Object[] cloneArray() {
return array.clone();
}
}
Benchmark Mode Cnt
Score Error Units
ArrayCloneBenchmark.cloneArray avgt 20
12,713 ± 0,484 ns/op
ArrayCloneBenchmark.cloneArray:·gc.alloc.rate avgt 20
800,247 ± 29,584 MB/sec
ArrayCloneBenchmark.cloneArray:·gc.alloc.rate.norm avgt 20
16,004 ± 0,001 B/op
ArrayCloneBenchmark.cloneArray:·gc.churn.G1_Eden_Space avgt 20
804,623 ± 38,424 MB/sec
ArrayCloneBenchmark.cloneArray:·gc.churn.G1_Eden_Space.norm avgt 20
16,091 ± 0,455 B/op
ArrayCloneBenchmark.cloneArray:·gc.churn.G1_Survivor_Space avgt 20
0,006 ± 0,002 MB/sec
ArrayCloneBenchmark.cloneArray:·gc.churn.G1_Survivor_Space.norm avgt 20 ≈
10⁻⁴ B/op
ArrayCloneBenchmark.cloneArray:·gc.count avgt 20
286,000 counts
ArrayCloneBenchmark.cloneArray:·gc.time avgt 20
171,000 ms
-------------
PR: https://git.openjdk.org/jdk/pull/10526