RFR: 8280035: Use Class.isInstance instead of Class.isAssignableFrom where applicable [v2]

Andrey Turbanov aturbanov at openjdk.java.net
Thu May 19 21:23:45 UTC 2022


On Thu, 31 Mar 2022 08:03:23 GMT, Andrey Turbanov <aturbanov at openjdk.org> wrote:

>> Method `Class.isAssignableFrom` is often used in form of:
>> 
>>     if (clazz.isAssignableFrom(obj.getClass())) {
>> Such condition could be simplified to more shorter and performarnt code
>> 
>>     if (clazz.isInstance(obj)) {
>>     
>> Replacement is equivalent if it's known that `obj != null`.
>> In JDK codebase there are many such places.
>> 
>> I tried to measure performance via JMH
>> 
>>     Class<?> integerClass = Integer.class;
>>     Class<?> numberClass = Number.class;
>> 
>>     Object integerObject = 45666;
>>     Object doubleObject = 8777d;
>> 
>>     @Benchmark
>>     public boolean integerInteger_isInstance() {
>>         return integerClass.isInstance(integerObject);
>>     }
>> 
>>     @Benchmark
>>     public boolean integerInteger_isAssignableFrom() {
>>         return integerClass.isAssignableFrom(integerObject.getClass());
>>     }
>> 
>>     @Benchmark
>>     public boolean integerDouble_isInstance() {
>>         return integerClass.isInstance(doubleObject);
>>     }
>> 
>>     @Benchmark
>>     public boolean integerDouble_isAssignableFrom() {
>>         return integerClass.isAssignableFrom(doubleObject.getClass());
>>     }
>> 
>>     @Benchmark
>>     public boolean numberDouble_isInstance() {
>>         return numberClass.isInstance(doubleObject);
>>     }
>> 
>>     @Benchmark
>>     public boolean numberDouble_isAssignableFrom() {
>>         return numberClass.isAssignableFrom(doubleObject.getClass());
>>     }
>> 
>>     @Benchmark
>>     public boolean numberInteger_isInstance() {
>>         return numberClass.isInstance(integerObject);
>>     }
>> 
>>     @Benchmark
>>     public boolean numberInteger_isAssignableFrom() {
>>         return numberClass.isAssignableFrom(integerObject.getClass());
>>     }
>> 
>>     @Benchmark
>>     public void numberIntegerDouble_isInstance(Blackhole bh) {
>>         bh.consume(numberClass.isInstance(integerObject));
>>         bh.consume(numberClass.isInstance(doubleObject));
>>     }
>> 
>>     @Benchmark
>>     public void integerIntegerDouble_isAssignableFrom(Blackhole bh) {
>>         bh.consume(integerClass.isAssignableFrom(integerObject.getClass()));
>>         bh.consume(integerClass.isAssignableFrom(doubleObject.getClass()));
>>     }
>> 
>> `isInstance` is a bit faster than `isAssignableFrom`
>> 
>> Benchmark                              Mode  Cnt  Score   Error  Units
>> integerDouble_isAssignableFrom         avgt    5  1,173 ± 0,026  ns/op
>> integerDouble_isInstance               avgt    5  0,939 ± 0,038  ns/op
>> integerIntegerDouble_isAssignableFrom  avgt    5  2,106 ± 0,068  ns/op
>> numberIntegerDouble_isInstance         avgt    5  1,516 ± 0,046  ns/op
>> integerInteger_isAssignableFrom        avgt    5  1,175 ± 0,029  ns/op
>> integerInteger_isInstance              avgt    5  0,886 ± 0,017  ns/op
>> numberDouble_isAssignableFrom          avgt    5  1,172 ± 0,007  ns/op
>> numberDouble_isInstance                avgt    5  0,891 ± 0,030  ns/op
>> numberInteger_isAssignableFrom         avgt    5  1,169 ± 0,014  ns/op
>> numberInteger_isInstance               avgt    5  0,887 ± 0,016  ns/op
>
> Andrey Turbanov has updated the pull request incrementally with one additional commit since the last revision:
> 
>   8280035: Use Class.isInstance instead of Class.isAssignableFrom where applicable
>   apply suggestion to avoid second Method.invoke call

Thank you for review!

-------------

PR: https://git.openjdk.java.net/jdk/pull/7061


More information about the hotspot-jfr-dev mailing list