On Tue, 29 Nov 2022 19:39:02 GMT, Aleksey Shipilev <sh...@openjdk.org> wrote:
> [JDK-8271820](https://bugs.openjdk.org/browse/JDK-8271820) introduced the > `@Stable private Boolean callerSensitive;` cache in `Method`. That field is > essentially a tri-state `Boolean` that relies on its `null` value to serve as > "not initialized" value for `@Stable`. > > This works well when the holder `Method` instance is constant: JIT compilers > fold `@Stable` well. But if such folding fails, we always dereference the > full-blown reference to "boxed" `Boolean` from the field on every access. We > can instead do a more lean tri-state primitive field to improve that > non-optimized case without sacrificing optimized case. > > I chose `byte` and `-1`, `0`, `1` to let the fastpath encode well on most > (all?) architectures. > > On adhoc benchmark like: > > > @State(Scope.Thread) > public class WrapperConstness { > static final Method CONST; > static Method NON_CONST; > > static { > try { > CONST = WrapperConstness.class.getDeclaredMethod("target"); > NON_CONST = CONST; > } catch (NoSuchMethodException e) { > throw new RuntimeException(e); > } > } > > public void target() {} > > @Benchmark > public void nonConstant() throws Exception { > NON_CONST.invoke(this); > } > > @Benchmark > public void constant() throws Exception { > CONST.invoke(this); > } > } > > > We have a minor improvement for non-const case, confirmed due to better > `isCallerSensitive` access: > > > Benchmark Mode Cnt Score Error Units > > # Baseline > WrapperConstness.constant avgt 25 0.410 ± 0.010 ns/op > WrapperConstness.nonConstant avgt 25 7.283 ± 0.025 ns/op > > # Patched > WrapperConstness.constant avgt 5 0.407 ± 0.008 ns/op > WrapperConstness.nonConstant avgt 5 7.054 ± 0.027 ns/op ; -3% > > > Additional testing: > - [x] Ad-hoc benchmarks > - [x] Linux x86_64 fastdebug `java/lang/reflect` > - [x] Linux x86_64 fastdebug `tier1`, `tier2` This pull request has now been integrated. Changeset: 9bbcb546 Author: Aleksey Shipilev <sh...@openjdk.org> URL: https://git.openjdk.org/jdk/commit/9bbcb546c86b40ae23d46e12a1a03aae7a7a6182 Stats: 9 lines in 1 file changed: 4 ins; 0 del; 5 mod 8297784: Optimize @Stable field for Method.isCallerSensitive Reviewed-by: redestad, jvernee, alanb ------------- PR: https://git.openjdk.org/jdk/pull/11422