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

Сергей Цыпанов duke at openjdk.org
Fri Jul 1 12:29:37 UTC 2022


On Fri, 1 Jul 2022 10:48:32 GMT, Peter Levart <plevart at openjdk.org> wrote:

>> But, ... is any code path accessing the elements of the @Stable array by constant indexes? Only in that case would the annotation have any effect on the JIT-ed code. Otherwise it's just a waste of space.
>
> ... 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?

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

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


More information about the core-libs-dev mailing list