I was interested in performance question about determine type of object and write some benchmarks with 2 ways of determination.
Can someone explain me why variant with instanceof
faster 350 times than variant with class name switching with strings?
Code:
class A {}
class B extends A {}
public class InstanceOfBenchmark {
public static final Object a = new A();
@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void testInstanceOf()
{
if (a instanceof B) {}
else if (a instanceof String) {}
else if (a instanceof ArrayList) {}
else if (a instanceof HashMap) {}
else if (a instanceof HashSet) {}
else if (a instanceof A);
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void testName() {
String class_name = a.getClass().getSimpleName();
switch (class_name) {
case ("B") :
case ("String") :
case ("ArrayList") :
case ("HashMap") :
case ("HashSet") :
case ("A") :
}
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(InstanceOfBenchmark.class.getSimpleName())
.warmupIterations(20)
.measurementIterations(100)
.forks(1)
.build();
new Runner(opt).run();
}
}
Results:
Benchmark Mode Cnt Score Error Units
InstanceOfBenchmark.testInstanceOf thrpt 100 3482.001 ± 25.447 ops/us
InstanceOfBenchmark.testName thrpt 100 10.579 ± 0.078 ops/us
I run tests with 200 times warmup and 2000 iteration too, result was same.
instanceof
uses. – Clutterinstanceof
maybe is executed as 1 or 2 codes of JVM – Centuplicateinstanceof
was one of the slowest operators in Java. And we use it in everyif
statement. Or one-to-oneinstanceof
faster than comparing strings? – Nippleinstanceof
doesn't require putting together a string of the class name. – Luhefinal
from the fourth line? – Mcwilliamsinstanceof
still faster ~50 times – Nipple