Performance of instanceof with interfaces is multiple times slower than with classes
Andrew Haley
aph at redhat.com
Sat Jul 18 13:11:22 UTC 2020
On 15/07/2020 10:08, Christoph Dreis wrote:
> Benchmark Mode Cnt Score Error Units
> MyBenchmark.testInstanceOfClass avgt 10 2,085 ± 0,179 ns/op
> MyBenchmark.testInstanceOfInterface avgt 10 18,783 ± 0,595 ns/op
>
> I was surprised to see that the interface variant is so much slower.
> Both checks should return false and there is no big hierarchy that needs to be walked up/down.
>
> Could you enlighten me what the cause for this is and maybe point me to the code where this is done?
> Is this maybe even a bug/regression? Can we maybe do something to improve the interface case?
You need to keep in mind that JMH testing of such extremely small
intervals of time is difficult to do. A single load from L1 cache has
a latency of four or five cycles, so about 1 - 1.3ns. Your
testInstanceOfClass test takes essentially no time at all: that 2ns is
the cost of Blackhole.consume, as you'll see if you try
@Benchmark
public boolean testEmptyMethod(BenchmarkState state) {
return true;
}
I getL
Benchmark Mode Cnt Score Error Units
Invoke.testEmptyMethod avgt 3 5.172 ± 0.019 ns/op
Invoke.testInstanceOfClass avgt 3 5.175 ± 0.023 ns/op
Invoke.testInstanceOfInterface avgt 3 13.370 ± 0.303 ns/op
Your microbenchmark here is too micro. :-)
--
Andrew Haley (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
More information about the hotspot-runtime-dev
mailing list