RFR: 8351565: Implement JEP 502: Stable Values (Preview) [v51]
Per Minborg
pminborg at openjdk.org
Thu Apr 10 12:54:52 UTC 2025
On Wed, 9 Apr 2025 17:25:02 GMT, Rémi Forax <forax at openjdk.org> wrote:
>> Per Minborg has updated the pull request incrementally with one additional commit since the last revision:
>>
>> Fix typo in return type
>
> Hello,
> I do not know if you know but StableValue.map() does not seems to be optimized correctly.
>
> Here is the benchmark i use:
>
> @Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
> @Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
> @Fork(value = 1, jvmArgs = { "--enable-preview" })
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> @State(Scope.Benchmark)
> public class StableValueBenchmarks {
> private static final MemoryLayout LAYOUT = MemoryLayout.structLayout(
> ValueLayout.JAVA_INT.withName("x"),
> ValueLayout.JAVA_INT.withName("y")
> );
>
> private static final long SIZEOF = LAYOUT.byteSize();
> private static final long OFFSET_X = LAYOUT.byteOffset(groupElement("x"));
> private static final long OFFSET_Y = LAYOUT.byteOffset(groupElement("y"));
>
> private static final VarHandle VH_X = LAYOUT.arrayElementVarHandle(groupElement("x"))
> .withInvokeExactBehavior();
> private static final VarHandle VH_Y = LAYOUT.arrayElementVarHandle(groupElement("y"))
> .withInvokeExactBehavior();
>
> private static final Supplier<VarHandle> SV_X = StableValue.supplier(
> () -> LAYOUT.arrayElementVarHandle(groupElement("x")).withInvokeExactBehavior());
> private static final Supplier<VarHandle> SV_Y = StableValue.supplier(
> () -> LAYOUT.arrayElementVarHandle(groupElement("y")).withInvokeExactBehavior());
>
> private static final Map<String, VarHandle> SMAP = StableValue.map(
> Set.of("x", "y"),
> name -> LAYOUT.arrayElementVarHandle(groupElement(name)).withInvokeExactBehavior());
>
> private final MemorySegment confined;
> {
> var array = new int[512 * (int) SIZEOF / (int) ValueLayout.JAVA_INT.byteSize()];
> var heap = MemorySegment.ofArray(array);
> for(var i = 0; i < 512; i++) {
> heap.set(ValueLayout.JAVA_INT, i * SIZEOF + OFFSET_X, i);
> heap.set(ValueLayout.JAVA_INT, i * SIZEOF + OFFSET_Y, i);
> }
> confined = Arena.ofConfined().allocate(LAYOUT, 512);
> confined.copyFrom(heap);
> }
>
> @Benchmark
> public int confinedVarHandleLoop() {
> var sum = 0;
> for(var i = 0; i < 512; i++) {
> var x = (int) VH_X.get(confined, 0L, (long) i);
> var y = (int) VH_Y.get(confined, 0L, (long) i);
> sum += x +y;
> }
> return sum;
> }
>
> @Benchmark
> public int confinedStableValueLoop() {
> var sum = 0;
> for(var i = 0; i < 512; i++) {
> var x = (int) SV_X.get().get(confined, 0L, (long) i);
> var y = (int) SV_Y.get().get(confined, 0L, (long) i);
> sum += x +...
@forax The same problem can be observed using pure unmodifiable maps so there is a problem elsewhere:
private static final Map<String, VarHandle> U_MAP = Map.of(
"x", VH_X,
"y", VH_Y);
...
@Benchmark
public int confinedUnmodifiableMapLoop() {
var sum = 0;
for(var i = 0; i < 512; i++) {
var x = (int) U_MAP.get("x").get(confined, 0L, (long) i);
var y = (int) U_MAP.get("y").get(confined, 0L, (long) i);
sum += x +y;
}
return sum;
}
I will take a look at it.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/23972#issuecomment-2792664301
More information about the core-libs-dev
mailing list