Performance of instanceof with interfaces is multiple times slower than with classes

Christoph Dreis christoph.dreis at freenet.de
Wed Jul 15 09:08:42 UTC 2020


Hi,

please forgive me if this is a stupid question or a known problem.

I was working on something that involved an instanceof check and needed to change it slightly.
I was surprised to see that the performance difference between an interface and a class is quite big.

E.g. consider the following benchmark:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
public class MyBenchmark {

	interface TestInterface {}
	private static class TestClass {}
	private static class AnotherClass {}

	@State(Scope.Thread)
	public static class BenchmarkState {
		private Object clazz = new MyBenchmark.TestClass();
	}

	@Benchmark
	public boolean testInstanceOfInterface(BenchmarkState state) {
		return state.clazz instanceof TestInterface;
	}

	@Benchmark
	public boolean testInstanceOfClass(BenchmarkState state) {
		return state.clazz instanceof AnotherClass;
	}
}

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?

Thanks in advance,
Cheers,
Christoph




More information about the hotspot-runtime-dev mailing list