On Mon, 7 Apr 2025 16:00:41 GMT, Per Minborg <pminb...@openjdk.org> wrote:
>> Implement JEP 502. >> >> The PR passes tier1-tier3 tests. > > 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 +y; } return sum; } @Benchmark public int confinedStableMapLoop() { var sum = 0; for(var i = 0; i < 512; i++) { var x = (int) SMAP.get("x").get(confined, 0L, (long) i); var y = (int) SMAP.get("y").get(confined, 0L, (long) i); sum += x +y; } return sum; } } Results for Stable.map() are way of: Benchmark Mode Cnt Score Error Units StableValueBenchmarks.confinedStableMapLoop avgt 5 21832,999 ± 50,422 ns/op StableValueBenchmarks.confinedStableValueLoop avgt 5 144,546 ± 0,640 ns/op StableValueBenchmarks.confinedVarHandleLoop avgt 5 146,320 ± 1,789 ns/op ------------- PR Comment: https://git.openjdk.org/jdk/pull/23972#issuecomment-2790451306