What the bench shows
Full method, hardware, raw numbers and caveats. These figures are not a promise for every server: they compare identical scenarios on one machine.
Bench and method
Release build, flat world, view distance 2, Java 25 (Temurin) with default JVM settings. Two runs per scenario: 20 s warmup, 45 s measurement. MSPT comes from tick query; TPS from the time query gametime increment.
- CPU
- Ryzen 9 7945HX
- OS
- Windows 11
- Build
release, HEAD d3b74fd- World
- flat, view distance 2
- Bots
- 20
- Warmup / measurement
- 20 s / 45 s
- Repetitions
- 2 per scenario
- Java
- Temurin 25, default settings
End-to-end scenarios
Join is p95 connection latency. MSPT and memory are from the same run. Lower is better; for TPS, higher is better.
| Scenario | Chunkwake | Vanilla 26.3 | ||||
|---|---|---|---|---|---|---|
| Join p95 | MSPT | Memory | Join p95 | MSPT | Memory | |
| Simultaneous join | 11.1–25.5 ms | 0.4–0.5 ms | 187–188 MiB | 845–860 ms | 2.1–2.6 ms | 907–929 MiB |
| Movement | 16.4–47.1 ms | 0.4–0.5 ms | 182–190 MiB | 703–746 ms | 2.7–3.1 ms | 860–864 MiB |
| World exploration | 25.2–30.4 ms | 0.8 ms | 207–209 MiB | 698–891 ms | 3.4–4.3 ms | 868–877 MiB |
| Redstone, 128 lamps and wires | 16.1–16.2 ms | 0.4–0.5 ms | 189–190 MiB | 897–960 ms | 3.4–3.5 ms | 845–859 MiB |
| 2500 cowsTPS 20 / 4.4–8.6 | 16.2 ms | 3.9–5.6 ms | 230–236 MiB | 682–925 ms | 120–221 ms | 909–913 MiB |
Server startup: Chunkwake 0.6–0.9 s, vanilla 6.6–11.4 s.
What the runs found
- During the day, zombies, skeletons, creepers and spiders spawned in the flat world and killed bots: 172 deaths versus 30 for vanilla. Light in an unloaded flat-world column read as 0 instead of the template value, and sky darkening used the wrong timeline. After the fix both checks pass and Chunkwake has no deaths.
- The cow numbers were taken while extra monsters were still around. The botless "Simple" profile is reported as an error on both servers: that is a bench bug, not a server bug.
CPU optimizations
| What | Before | After | Change |
|---|---|---|---|
| Random ticks, 400 ticks at 4096 | 56.7 s | 32.5–33.5 s (vanilla 43 s) | state kinds in a table; leaves tick only when decaying; deferred distance recompute |
/fill 32×16×32 (fill_16k) | 288 ms | 35 ms | one world lock, one light pass, one broadcast queue per batch |
| Block write with light | 33.5 µs | ~28 µs | neighbours are read once for observers, fire and leaves |
Memory
Measured with scripts/measure-memory.ps1: fresh worlds with seed 12345, 60 s of flight at 20 blocks/s, simulation 6. Private is Windows PrivateMemorySize64; peak is the maximum of samples every 2 s; after is 30 s after the bot leaves.
| Profile | Private idle | Peak | After 30 s | Average view |
|---|---|---|---|---|
| A: view 10, baseline | 391.5 MB | 1317.3 MB | 1003.9 MB | 100.0 % |
| A: view 10, final normal | 348.7 MB | 1222.6 MB | 965.2 MB | 100.0 % |
| B: view 32, baseline | 391.4 MB | 1991.3 MB | 1330.5 MB | 94.2 % |
| B: view 32, final normal | 351.1 MB | 1818.4 MB | 1164.6 MB | 92.5 % |
| A: view 10, final low | 339.2 MB | 776.6 MB | 445.2 MB | 99.6 % |
Live heap after flight with zero loaded columns: 480 → 417 MB. Process private memory is still three times the live heap: mimalloc keeps pages after the peak. arena_eager_commit=0 was rejected: in profile A low it gave 504.1 MB instead of 445.2 MB.
Storage
Same flight: 13,052 full chunks. A full chunk at deflate 6 is 6.9 KB versus 8.7 KB for vanilla. Free sectors are reused, and a repeated backup with no changes uses hard links.
| deflate | Data, MB | In sectors, MB | Compress, µs/chunk | Decompress, µs/chunk |
|---|---|---|---|---|
| 1 | 124 | 149 | 69–106 | 40–59 |
| 3 | 90 | 116 | 156–204 | 38–67 |
| 6 | 85 | 113 | 257–340 | 41–66 |
| 9 | 83 | 110 | 2020 | 38–67 |
Caveats
- This is one machine and two runs per scenario. The spread is visible in the ranges; do not project the difference onto any hardware.
- The cow profile compares load, not identical work: cow AI in Chunkwake is still being verified against vanilla.
- World settings that Chunkwake does not apply yet cannot be considered equivalent to vanilla. Speed does not replace behaviour checks.
- Memory is the process peak under a specific scenario, not an
-Xmxrecommendation. Plugins still need Java 25+. - This is a core-only result: the bench runs without user plugins.
Reproduction
Build the lab and the release server, then repeat the run. The lab downloads server.jar from the Mojang manifest if it is not provided and checks for Java 25+.
cargo build -p chunkwake-lab
cargo build --release -p chunkwake-server
chunkwake-lab bench --chunkwake target/release/chunkwake \
--jar server.jar --accept-vanilla-eula \
--profile all --bots 20 --warmup 20 --duration 45 --repetitions 2Figures come from docs/perf.md and docs/lab.md on ver/26.3. If this page disagrees with the sources, trust the sources.