> When looking at larger benchmarks, I noted a discrepancy between the > performance of off-heap segments and on-heap segments. Looking at the > assembly for the `MemorySegment::asSlice` method I could see some additional > barriers in the off-heap case, but could not initially make sense of them. > Vlad pointed me at G1 (in fact no such barrier was emitted when using a > different GC, such as the serial GC, or ZGC), and later Erik narrowed the > problem down to a failure in a C2 optimization to remove barriers around > initializing stores. This problem was caused by a synthetic cast added by > javac to a value (the base object) that initialized the newly created memory > segment slice. Because of that case, C2 missed the store as an "initializing" > one, and inserted additional barriers. This patch should make performance of > on-heap segments a lot more reliable, especially when slicing is involved.
Maurizio Cimadamore has updated the pull request incrementally with one additional commit since the last revision: Fix and enhance benchmark ------------- Changes: - all: https://git.openjdk.java.net/jdk18/pull/97/files - new: https://git.openjdk.java.net/jdk18/pull/97/files/af8fb319..712f9fb5 Webrevs: - full: https://webrevs.openjdk.java.net/?repo=jdk18&pr=97&range=02 - incr: https://webrevs.openjdk.java.net/?repo=jdk18&pr=97&range=01-02 Stats: 114 lines in 1 file changed: 96 ins; 9 del; 9 mod Patch: https://git.openjdk.java.net/jdk18/pull/97.diff Fetch: git fetch https://git.openjdk.java.net/jdk18 pull/97/head:pull/97 PR: https://git.openjdk.java.net/jdk18/pull/97