Skip to content

refactor: move cob thread tracking to a slot pool for performance #10

Open
bruno-dasilva wants to merge 3 commits into
masterfrom
bruno/cob-slotpool
Open

refactor: move cob thread tracking to a slot pool for performance #10
bruno-dasilva wants to merge 3 commits into
masterfrom
bruno/cob-slotpool

Conversation

@bruno-dasilva

Copy link
Copy Markdown
Owner

No description provided.

Change

Moves cob engine's internal storage/tracking of threads to a slot pool backed by a std::deque instead of a spring::unordered_map, to eek out some extra performance.

There's a hack due to ordering requirements of the existing code but I figure a second PR can clean that up - let's keep this PR focused.

Context

Some instrumentation of our hash maps found that cob was one of the worst users of our spring::unordered_map, because of how many tombstones it would leave behind in the map (cob has constant thread churn).

`spring::unordered_map<int, CCobThread> threadInstances` performance over 5000 late game sim frames was:
```
[HashContainerStats] Top 20 containers by total time (ns/op):
  type                         |  total-ms |  find-hit |  find-miss |     insert |      erase |     rehash
  synced map<int, CCobThread>  |  3031.91ms |     130ns |     1360ns |     1292ns |        0ns |   219100ns
```
Changing it to a chained hashmap fixed the find-miss() ns per op (since it didnt have to search the entire array of tombstones) but made the find() worse because it had to chase bucket pointers.

So, taking a step back and realizing that nothing really iterates on this and the amount of churn it sees, an object pool is probably a better data structure. So let's try it!
@github-actions

github-actions Bot commented Apr 26, 2026

Copy link
Copy Markdown

bar-benchmark — PR #10

candidate 0269d20 vs baseline eb1c69f

sim trimmed mean (ms) with 95% CI on the relative delta

scenario candidate baseline Δ (95% CI) n cand n base
fightertest-bots 23.84 ms ♻️ 23.85 ms ♻️ $\color{green}{-0.21\%} \text{ to } \color{red}{+0.09\%}$ 50 70
fightertest-aircraft 19.27 ms ♻️ 19.17 ms ♻️ $\color{red}{+0.40\%} \text{ to } \color{red}{+0.62\%}$ 50 70
fightertest-tanks 24.81 ms ♻️ 24.82 ms ♻️ $\color{green}{-0.25\%} \text{ to } \color{red}{+0.16\%}$ 50 70
fightertest-pathfinding 21.88 ms ♻️ 21.77 ms ♻️ $\color{red}{+0.35\%} \text{ to } \color{red}{+0.70\%}$ 50 70
lategame1 22.35 ms ♻️ 23.42 ms ♻️ $\color{green}{-5.32\%} \text{ to } \color{green}{-3.86\%}$ 70 100
Per-VM distribution box plots (5)

fightertest-bots

fightertest-aircraft

fightertest-tanks

fightertest-pathfinding

lategame1

💰 compute cost: $0.00 · 0 fresh legs · 10 cached at $0 last updated: 2026-04-26T07:31:41.102Z · [workflow run](https://github.com/bruno-dasilva/RecoilEngine/actions/runs/24951163414)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant