Performance
Osmium, Oxide and Carbon on one machine at the same moment, with 50 to 200 players. With 40 popular plugins Osmium is faster than both; against Carbon with two plugins or none, frame rate is equal. Every result has its 95% interval.
Under load, side by side
The three servers ran at the same time, each on its own block of processor cores, with players joining through the game’s own connection path and walking, looting, gathering, building, fighting, driving and flying jets. Three plugin sets, 50, 100 and 200 players.
- 24.4%more fps
- frames per second against Oxide with 200 players and 40 popular plugins. From 100 players up Osmium is ahead of Oxide in every plugin set: frame rate +4.9 to +24.4%, worst-case (p99) frames 6 to 18% shorter, main-thread CPU per frame 6 to 22% lower. It allocates 14 to 24% less at every load.
- 18.8%more fps
- frames per second against Carbon with 200 players and 40 popular plugins, with p99 frames 24.3% shorter, CPU per frame 17.5% lower and 50.2% less allocation.
- 11.7%shorter p99
- worst-case (p99) frame time against Carbon with the owner’s plugins (F22Raptor and Tungsten) at 200 players, and 5.2% shorter at 100. In this set frame rate and CPU per frame are equal to Carbon, and allocation is lower at 100 and 200 players.
- Equal
- to Carbon without plugins, on frame rate and frame times. Main-thread CPU per frame is 3.8% higher than Carbon at 200 players; the next optimization round targets it.
- 1 to 3
- garbage collections per step at 200 players, against 5 to 12 for Oxide and Carbon, with collection frames of the same 60 to 110 ms.
All 90 results: 57 better, 30 equal, 3 worse
Osmium against each reference, from a model with the time window, the framework and the processor block as factors. A result is better or worse only when its 95% interval excludes zero. Higher fps is better; for frame times, CPU per frame and allocation, lower is better.
On a phone, swipe each chart sideways for the other plugin sets. The table scrolls sideways too.
Osmium vs OxideOsmium vs Carbona measured differenceequal: within the noise
No plugins
Owner set, 2 plugins
Heavy set, 40 plugins
No plugins
Owner set, 2 plugins
Heavy set, 40 plugins
No plugins
Owner set, 2 plugins
Heavy set, 40 plugins
No plugins
Owner set, 2 plugins
Heavy set, 40 plugins
No plugins
Owner set, 2 plugins
Heavy set, 40 plugins
Every number, as a table 90 rows
| Plugins | Players | Osmium vs | fps | frame p50 | frame p99 | CPU per frame | allocation |
|---|---|---|---|---|---|---|---|
| No plugins | 50 | Oxide | -4.9% [-9.4, -0.2] worse | +6.1% [+0.2, +12.3] worse | -1.1% [-7.5, +5.8] equal | -7.7% [-12.0, -3.1] better | -22.7% [-33.0, -10.8] better |
| Carbon | -2.6% [-7.2, +2.1] equal | +3.7% [-2.1, +9.8] equal | -1.8% [-8.2, +5.1] equal | -7.1% [-11.5, -2.6] better | -8.0% [-20.2, +6.1] equal | ||
| 100 | Oxide | +7.6% [+1.9, +13.6] better | -6.8% [-12.8, -0.3] better | -11.6% [-15.4, -7.6] better | -12.6% [-17.1, -7.8] better | -20.4% [-22.8, -17.9] better | |
| Carbon | -0.6% [-5.8, +5.0] equal | +0.3% [-6.2, +7.3] equal | -2.8% [-6.9, +1.6] equal | +5.1% [-0.3, +10.8] equal | -4.5% [-7.3, -1.5] better | ||
| 200 | Oxide | +10.5% [+7.1, +14.1] better | -10.6% [-14.4, -6.7] better | -11.2% [-16.1, -6.1] better | -10.0% [-12.8, -7.1] better | -21.8% [-23.2, -20.2] better | |
| Carbon | -2.7% [-5.8, +0.4] equal | +2.6% [-1.7, +7.1] equal | -2.5% [-7.9, +3.1] equal | +3.8% [+0.5, +7.1] worse | -5.9% [-7.7, -4.0] better | ||
| Owner set | 50 | Oxide | +1.3% [-1.8, +4.5] equal | -0.1% [-3.0, +2.9] equal | -2.5% [-9.1, +4.5] equal | -6.2% [-11.0, -1.1] better | -23.0% [-37.0, -5.9] better |
| Carbon | -0.6% [-3.6, +2.6] equal | +0.8% [-2.1, +3.8] equal | -3.2% [-9.7, +3.8] equal | +0.4% [-4.8, +5.8] equal | -9.5% [-26.0, +10.6] equal | ||
| 100 | Oxide | +4.9% [+2.2, +7.6] better | -5.5% [-9.2, -1.8] better | -6.2% [-9.1, -3.4] better | -6.1% [-8.8, -3.4] better | -18.5% [-21.8, -15.1] better | |
| Carbon | -0.4% [-2.9, +2.2] equal | +0.4% [-3.5, +4.5] equal | -5.2% [-8.1, -2.3] better | +2.1% [-0.8, +5.0] equal | -8.3% [-12.0, -4.4] better | ||
| 200 | Oxide | +14.7% [+11.0, +18.6] better | -14.1% [-17.5, -10.6] better | -12.2% [-16.9, -7.3] better | -13.2% [-16.1, -10.1] better | -21.4% [-25.0, -17.6] better | |
| Carbon | +1.0% [-2.3, +4.5] equal | -0.8% [-4.7, +3.3] equal | -11.7% [-16.4, -6.8] better | -1.1% [-4.4, +2.4] equal | -7.6% [-11.8, -3.2] better | ||
| Heavy set | 50 | Oxide | +0.8% [-0.1, +1.6] equal | -0.3% [-0.5, -0.0] better | -12.9% [-17.0, -8.5] better | -5.3% [-7.6, -2.9] better | -24.4% [-35.3, -11.7] better |
| Carbon | +0.7% [-0.2, +1.5] equal | -0.4% [-0.6, -0.1] better | -7.2% [-11.6, -2.6] better | -3.0% [-5.4, -0.5] better | -34.9% [-44.2, -23.9] better | ||
| 100 | Oxide | +6.8% [+3.3, +10.4] better | -5.6% [-9.5, -1.6] better | -14.0% [-18.0, -9.8] better | -18.6% [-21.9, -15.1] better | -15.3% [-18.1, -12.3] better | |
| Carbon | +2.3% [-1.0, +5.8] equal | -1.3% [-5.4, +2.9] equal | -9.0% [-13.2, -4.5] better | -7.2% [-11.0, -3.2] better | -39.2% [-41.2, -37.0] better | ||
| 200 | Oxide | +24.4% [+21.2, +27.7] better | -19.4% [-21.5, -17.2] better | -18.2% [-22.8, -13.3] better | -22.1% [-24.1, -19.9] better | -14.1% [-17.4, -10.8] better | |
| Carbon | +18.8% [+15.8, +21.9] better | -14.2% [-16.4, -11.9] better | -24.3% [-28.6, -19.7] better | -17.5% [-19.7, -15.3] better | -50.2% [-52.0, -48.2] better |
The three worse results, at two steps
- No plugins, 50 players, against Oxide: fps -4.9% and frame p50 +6.1%. All three sat at the game’s 256 fps cap there, where Osmium used 7.7% less CPU per frame, and the medians (253 against 247 fps) point the other way. We count them as worse because the model says so.
- No plugins, 200 players, against Carbon: CPU per frame +3.8% [+0.5, +7.1]. Frame rate and frame times are equal in the same step. The next optimization round targets it.
Method
- Builds. Osmium from our main branch, as shipped; Oxide 2.0.7815; Carbon 2.0.262 with its analytics, self-update, hook updates and admin module switched off. Rust 25797215, one game copied three times.
- At the same moment. Each server had its own 8-core block of the host’s processor; the assignment rotated before every 30-second block, so each spent equal time on each block.
- Players. Synthetic players join through the game’s own authentication and connection queue, tick 32 times a second through the normal input path, and walk, loot, gather, build, fight, drive and fly. Every run gives the k-th player the same role, place and choices.
- Plugin sets. None (only the four benchmark plugins); the owner’s set (F22Raptor and Tungsten); a heavy set of 40 popular plugins that run clean on all three, chosen by how often plugins use each hook.
- Same work for all three. After every step the servers’ activity is compared (players in game, ticks, RPCs, commands, shots, gathers, loots, jets mounted, plugins loaded). One step that differed, the heavy set at 50 players, was repeated and only the repeat counts.
- Same world. A 2,500 m procedural map, seed 4242, settled and saved once and copied fresh into every boot; a network limited to the machine itself; the same memory and CPU limits.
Limits. Each plugin set is one boot of each server, so the intervals cover variation within a run, not between boots. An earlier, slower run on the previous Osmium build, one framework at a time, agrees in direction on every large effect. Servers with no players are not part of these results.
Reproducing. The benchmark tools are in the Osmium repository (tools/bench: bench2.py runs a plugin set on all three at once, report2.py builds these tables). There is no public download.
Pasting a base
A separate measurement: the time until a pasted base is ready, every entity spawned and wired. With a 41-plugin set loaded, Osmium gets there 4 to 17% sooner across four bases, because calling the 8 plugins listening to OnEntitySpawned costs about 2 µs per entity on Osmium against 5.8 to 6.4 µs on Carbon and 6.9 to 7.5 µs on Oxide.
| 7,474-entity base, 41 plugins | Ready after |
|---|---|
| Osmium | 1.17 s |
| Oxide 2.0.7815 | 1.35 s |
| Carbon 2.0.262 | 1.42 s |
With CopyPaste alone and no other plugins, the three are within noise of each other, apart from the paste’s first frame, where Oxide reads the base file 13 to 22% slower.
Method. Rust 25797215 copied once per framework, the same saved map in every boot, the same 8-core CPU limit, a network limited to the machine itself, no players. CopyPaste alone, and with the 41 plugins; four bases from 3,305 to 10,950 entities, each pasted twice per boot over 12 boots in rotated order, timed every frame by a bench plugin identical on all three. Hook cost counted at each framework’s own dispatcher in separate pastes.