Skip to content

refactor: optimize field modifications in unsafe replacement#1733

Merged
derklaro merged 3 commits intonightlyfrom
unsafe-replacement-optimize
Sep 3, 2025
Merged

refactor: optimize field modifications in unsafe replacement#1733
derklaro merged 3 commits intonightlyfrom
unsafe-replacement-optimize

Conversation

@derklaro
Copy link
Member

@derklaro derklaro commented Sep 2, 2025

Motivation

Currently the replacement methods for field access are implemented very inefficient, leading to performance problems when a lot of calls are being made to them.

Modification

  1. Migrated away from passing around fields to wrapping them into a FieldAccessor instance which caches a VarHandle and optionally a MethodHandle instance for accessing/modifying the wrapped field.
  2. Changed the FieldOffsetOps to cache these FieldAccessors instead of caching the Fields.
  3. Changed the FieldOffsetOps to use a lock-free caching solution based on ClassValue and a FieldAccessor array, rather than using a ConcurrentHashMap with a custom key type.
  4. Reduced the complexity when using the VarHandle/MethodHandle instance for a field by introducing a dummy Object argument for static fields to allow passing an instance when none is actually needed.

Result

The unsafe replacement methods for field access improved significantly leading to way better server performance under certain circumstances.

@derklaro derklaro added this to the 4.0.0-RC15 milestone Sep 2, 2025
@derklaro derklaro requested a review from 0utplay September 2, 2025 16:43
@derklaro derklaro self-assigned this Sep 2, 2025
@derklaro derklaro added v: 4.X This pull should be included in the 4.0 release t: improvement The pull request improves existing code in: wrapper An issue/pull request releated to the wrapper module code labels Sep 2, 2025
@github-actions
Copy link

github-actions bot commented Sep 2, 2025

Test Results

 56 files  ±0   56 suites  ±0   2m 40s ⏱️ +48s
570 tests ±0  570 ✅ ±0  0 💤 ±0  0 ❌ ±0 
935 runs  ±0  935 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 650a860. ± Comparison against base commit 6b4ee4d.

This pull request removes 34 and adds 34 tests. Note that renamed tests count towards both.
eu.cloudnetservice.driver.impl.document.DocumentSerialisationTest ‑ [4] {"b":1,"s":2,"i":3,"l":4,"f":5.0,"d":6.0,"c":"/","string":"Hello, World!","bol":true,"cloud":["Ben?","Yes","No","HoHoHoHo"],"world":{"this":"is","hello":"world","insane":"!"}}, PRETTY
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [14] 2025-08-24
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [23] 13:29:16.407343809
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [28] 13:29:16.407456850Z
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [29] 13:29:16.407477989Z
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [30] 13:29:16.407500441+05:00
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [31] 13:29:16.407517333-03:00
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [34] 2025-08-24T13:29:16.407648227
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [39] 2025-08-24T13:29:16.407805992Z
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [4] 2025-08-24T13:29:16.399239740Z
…
eu.cloudnetservice.driver.impl.document.DocumentSerialisationTest ‑ [4] {"b":1,"s":2,"i":3,"l":4,"f":5.0,"d":6.0,"c":"/","string":"Hello, World!","bol":true,"cloud":["Ben?","Yes","No","HoHoHoHo"],"world":{"insane":"!","this":"is","hello":"world"}}, PRETTY
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [14] 2025-09-03
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [23] 08:15:39.426503778
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [28] 08:15:39.426627972Z
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [29] 08:15:39.426651636Z
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [30] 08:15:39.426676283+05:00
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [31] 08:15:39.426697953-03:00
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [34] 2025-09-03T08:15:39.426834330
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [39] 2025-09-03T08:15:39.426991415Z
eu.cloudnetservice.driver.impl.document.gson.JavaTimeSerializerTest ‑ [4] 2025-09-03T08:15:39.415704288Z
…

♻️ This comment has been updated with latest results.

@derklaro derklaro merged commit 21561cb into nightly Sep 3, 2025
5 checks passed
@derklaro derklaro deleted the unsafe-replacement-optimize branch September 3, 2025 21:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

in: wrapper An issue/pull request releated to the wrapper module code t: improvement The pull request improves existing code v: 4.X This pull should be included in the 4.0 release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants