RFR: 8288327: Executable.hasRealParameterData should not be volatile [v7]

Peter Levart plevart at openjdk.org
Fri Jul 1 18:35:43 UTC 2022


On Fri, 1 Jul 2022 12:26:04 GMT, Сергей Цыпанов <duke at openjdk.org> wrote:

>> ... I can only see the array being cloned and not accessed directly. I don't belive cloning a @stable array is any different in JIT-ed code as cloning normal "mutable" array unless JIT "sees" through it and scalarizes the values of the cloned array. For example, if you have the following:
>> 
>> 
>> static final Method method = ....;
>> 
>> @Benchmark
>> public Object getParameter0() {
>>   return method.getParameters()[0];
>> }
>> 
>> 
>> ...would it run faster when the parameters field was marked as @stable as opposed to not?
>
> @plevart I've checked it with and without `@stable`, it's the same:
> 
> with
> Benchmark                            Mode  Cnt  Score   Error  Units
> AccessParamsBenchmark.getParameter0  avgt   50  6,196 ± 0,142  ns/op
> AccessParamsBenchmark.getParameters  avgt   50  4,636 ± 0,075  ns/op
> 
> without
> Benchmark                            Mode  Cnt  Score   Error  Units
> AccessParamsBenchmark.getParameter0  avgt   50  6,196 ± 0,142  ns/op
> AccessParamsBenchmark.getParameters  avgt   50  4,636 ± 0,075  ns/op
> 
> This seems logical as effects of `@Stable` aren not propagated into cloned array.
> This is the benchmark I used:
> 
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> @Fork(jvmArgsAppend = {"-Xms1g", "-Xmx1g"})
> public class AccessParamsBenchmark {
> 
>   private final Method method;
> 
>   public AccessParamsBenchmark() {
>     try {
>       method = getClass().getMethod("foo", int.class, String.class);
>     } catch (NoSuchMethodException e) {
>       throw new RuntimeException(e);
>     }
>   }
> 
>   @Benchmark
>   public Object getParameters() {
>     return method.getParameters();
>   }
> 
>   @Benchmark
>   public Object getParameter0() {
>     return method.getParameters()[0];
>   }
> 
>   public void foo(int parameter1, String parameter2) {
>   }
> }
> 
> 
> So, should we rid the annotation from `parameters` field?

@Stable is only effective if the path leading to @Stable value can be constant-folded by JIT. In above test, you have an instance field Method method. This can not be constant-folded, so neither can @stable fiels in the Field object, nor array elements of a @stable array. You should replace that with "static final Method method = ..." and re-run the test.

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

PR: https://git.openjdk.org/jdk/pull/9143


More information about the core-libs-dev mailing list