RFR (trivial): 8216285: Enable inlining of CollectedHeap::obj-/array-/class_allocate

Claes Redestad claes.redestad at oracle.com
Tue Jan 8 12:10:52 UTC 2019



On 2019-01-08 12:56, Roman Kennke wrote:
>>>>>>> Those methods are virtual. How useful is it to flag them 'inline' ?
>>>>>>
>>>>>> Useful enough to measurably save a few ns/op on Array.newInstance and
>>>>>> Object.clone microbenchmarks (when running TieredStopAtLevel=1 to stay
>>>>>> in the JNI slow path).
>>>>>
>>>>> If a method is virtual, it cannot be inlined, right? Unless you call it
>>>>> in a funny non-virtual way. Or what am I missing?
>>>>
>>>> Could be these are the only implementations when compiling without
>>>> shenandoah so gcc realizes the virtual can be ignored?
>>>
>>> I doubt that gcc can make that call. The linker probably could, but at
>>> this point it would be too late. C++ is not Java. I don't think the
>>> patch hurts, but I doubt its usefulness ;-)
>>
>> I only go by what I see in microbenchmarks, and somehow this netted a
>> small improvement.
> 
> Ok.
> 
> I'm just curious. ;-) Can you by any chance send me the microbenchmark?
> Maybe I can figure out what's going on. I suppose there is a chance that
> if you call one of those methods with an object of known type, e.g.
> G1CollectedHeap*, and the compiler can prove that it cannot be a
> subtype, then yeah, it might actually inline it. If the benchmark is
> using jmh, you can run with and without the patch with perfasm profiler
> and it should show you what's different in the hot path.

I've run these:

import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;
import java.lang.reflect.Array;

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

    @Param({"10", "100", "1000"})
    private int length;

    public Object obj = new Object();

    @Benchmark
    public Object newInstance() {
      return Array.newInstance(String.class, length);
    }

    @Benchmark
    public Object clone() {
      return obj.clone();
    }

}

with -XX:TieredStopAtLevel=1 - -prof perfasm doesn't say much since the
time is mainly spent in native code, but async-profiler profiles
indicates the objArray_allocate method no longer manifests on the stack.

/Claes

> 
> Roman
> 
> 


More information about the hotspot-gc-dev mailing list