Run 74d6b2a5
- Date
- Build
- 0.6.1Same load, save, release and hop code as 0.6.0. 0.6.1 only adds checks on op names and descriptions.
- Used in the results page
- Yes
- Geode source
- 1c0a3221774d8f93266705d413deee65c2cb0384
Load, save and release
Live Roblox serversEach run loads five fresh profiles, saves each, releases each after a change, loads them again and releases them again, with the steps on one key at least 8 seconds apart. Times are seconds from calling the library until its DataStore request finished.
Load, new profile
Median (the upright tick) and min to max of every sample (the bar). Medians less than one timing step (16.7 ms (1/60 s)) apart are ties.
Table: Time
| Subject | Median | Min | Max | n | Failed | Tie with |
|---|---|---|---|---|---|---|
| Geode | 249 ms | 216 ms | 266 ms | 5 | 0 | ProfileService |
| Geode, mailbox = true | 266 ms | 182 ms | 299 ms | 5 | 0 | ProfileStore |
| ProfileStore | 266 ms | 216 ms | 283 ms | 5 | 0 | Geode, mailbox = true |
| ProfileService | 249 ms | 183 ms | 283 ms | 5 | 0 | Geode |
| DataStore2, Standard saving | 66 ms | 65 ms | 82 ms | 5 | 0 | – |
Requests per sample, by method. A range means the count varied between samples. 2 methods used.
| Subject | UpdateAsync | GetAsync | n | Counts |
|---|---|---|---|---|
| Geode | 1 | – | 5 | Same in every sample |
| Geode, mailbox = true | 1 | 1 | 5 | Same in every sample |
| ProfileStore | 1 | – | 5 | Same in every sample |
| ProfileService | 1 | – | 5 | Same in every sample |
| DataStore2, Standard saving | – | 1 | 5 | Same in every sample |
Load, stored profile
Median (the upright tick) and min to max of every sample (the bar). Medians less than one timing step (16.7 ms (1/60 s)) apart are ties.
Table: Time
| Subject | Median | Min | Max | n | Failed | Tie with |
|---|---|---|---|---|---|---|
| Geode | 199 ms | 166 ms | 216 ms | 5 | 0 | – |
| Geode, mailbox = true | 265 ms | 216 ms | 282 ms | 5 | 0 | ProfileService |
| ProfileStore | 233 ms | 233 ms | 266 ms | 5 | 0 | – |
| ProfileService | 251 ms | 199 ms | 283 ms | 5 | 0 | Geode, mailbox = true |
| DataStore2, Standard saving | 16 ms | 16 ms | 16 ms | 5 | 0 | – |
Requests per sample, by method. A range means the count varied between samples. 2 methods used.
| Subject | UpdateAsync | GetAsync | n | Counts |
|---|---|---|---|---|
| Geode | 1 | – | 5 | Same in every sample |
| Geode, mailbox = true | 1 | 1 | 5 | Same in every sample |
| ProfileStore | 1 | – | 5 | Same in every sample |
| ProfileService | 1 | – | 5 | Same in every sample |
| DataStore2, Standard saving | – | 1 | 5 | Same in every sample |
Save
Median (the upright tick) and min to max of every sample (the bar). Medians less than one timing step (16.7 ms (1/60 s)) apart are ties.
Table: Time
| Subject | Median | Min | Max | n | Failed | Tie with |
|---|---|---|---|---|---|---|
| Geode | 182 ms | 165 ms | 216 ms | 5 | 0 | ProfileStore |
| Geode, mailbox = true | 200 ms | 166 ms | 233 ms | 5 | 0 | ProfileService |
| ProfileStore | 166 ms | 133 ms | 266 ms | 5 | 0 | Geode |
| ProfileService | 200 ms | 150 ms | 250 ms | 5 | 0 | Geode, mailbox = true |
| DataStore2, Standard saving | 282 ms | 199 ms | 316 ms | 5 | 0 | – |
Requests per sample, by method. A range means the count varied between samples. 1 method used.
| Subject | UpdateAsync | n | Counts |
|---|---|---|---|
| Geode | 1 | 5 | Same in every sample |
| Geode, mailbox = true | 1 | 5 | Same in every sample |
| ProfileStore | 1 | 5 | Same in every sample |
| ProfileService | 1 | 5 | Same in every sample |
| DataStore2, Standard saving | 1 | 5 | Same in every sample |
Release
Median (the upright tick) and min to max of every sample (the bar). Medians less than one timing step (16.7 ms (1/60 s)) apart are ties.
Table: Time
| Subject | Median | Min | Max | n | Failed | Tie with |
|---|---|---|---|---|---|---|
| Geode | 200 ms | 183 ms | 266 ms | 5 | 0 | ProfileStore |
| Geode, mailbox = true | 250 ms | 232 ms | 266 ms | 5 | 0 | – |
| ProfileStore | 199 ms | 183 ms | 250 ms | 5 | 0 | Geode |
| ProfileService | 218 ms | 198 ms | 233 ms | 5 | 0 | DataStore2, Standard saving |
| DataStore2, Standard saving | 233 ms | 232 ms | 266 ms | 5 | 0 | ProfileService |
Requests per sample, by method. A range means the count varied between samples. 1 method used.
| Subject | UpdateAsync | n | Counts |
|---|---|---|---|
| Geode | 1 | 5 | Same in every sample |
| Geode, mailbox = true | 1 | 5 | Same in every sample |
| ProfileStore | 1 | 5 | Same in every sample |
| ProfileService | 1 | 5 | Same in every sample |
| DataStore2, Standard saving | 1 | 5 | Same in every sample |
Server hops
Live Roblox serversTwo Luau Execution tasks at once play the old and the new server. The old server loads a profile, saves 777, waits 8 seconds, then changes it to 888 (999 when it keeps the profile) without saving. Times are seconds from the new server's load call until it has the data.
Old server releases
The old server releases when the new one starts loading, the way a server releases when a player leaves for another one.
| Subject | Saw the final save |
|---|---|
| Geode | 3 of 3 |
| Geode, mailbox = true | 3 of 3 |
| ProfileStore | 3 of 3 |
| ProfileService | 3 of 3 |
| DataStore2, Standard saving | 0 of 3 |
Median (the upright tick) and min to max of every sample (the bar). Medians less than one timing step (16.7 ms (1/60 s)) apart are ties.
Table: Time
| Subject | Median | Min | Max | n | Failed | Tie with |
|---|---|---|---|---|---|---|
| Geode | 0.57 s | 0.48 s | 0.62 s | 3 | 0 | – |
| Geode, mailbox = true | 0.55 s | 0.50 s | 0.67 s | 3 | 0 | – |
| ProfileStore | 5.38 s | 0.63 s | 5.50 s | 3 | 0 | – |
| ProfileService | 7.23 s | 7.22 s | 7.25 s | 3 | 0 | – |
| DataStore2, Standard saving | 0.02 s | 0.02 s | 0.02 s | 3 | 0 | – |
Requests per sample, by method. A range means the count varied between samples. 3 methods used.
| Subject | UpdateAsync | GetAsync | GetAsync past the cache | n | Counts |
|---|---|---|---|---|---|
| Geode | 2 | – | 1 | 3 | Same in every sample |
| Geode, mailbox = true | 2 | 2 | 1 | 3 | Same in every sample |
| ProfileStore | 1 to 2 | – | – | 3 | Varied between samples |
| ProfileService | 2 | – | – | 3 | Same in every sample |
| DataStore2, Standard saving | – | 1 | – | 3 | Same in every sample |
Old server keeps it
The old server never releases on its own. 999 means the library got it to hand the profile over with its last change, 777 means the new server went ahead without it.
| Subject | Value seen |
|---|---|
| Geode | 999 in 1 of 1 |
| Geode, mailbox = true | 999 in 1 of 1 |
| ProfileStore | 999 in 1 of 1 |
| ProfileService | 999 in 1 of 1 |
| DataStore2, Standard saving | 777 in 1 of 1 |
Median (the upright tick) and min to max of every sample (the bar). Medians less than one timing step (16.7 ms (1/60 s)) apart are ties.
Table: Time
| Subject | Median | Min | Max | n | Failed | Tie with |
|---|---|---|---|---|---|---|
| Geode | 0.65 s | 0.65 s | 0.65 s | 1 | 0 | – |
| Geode, mailbox = true | 0.63 s | 0.63 s | 0.63 s | 1 | 0 | – |
| ProfileStore | 5.47 s | 5.47 s | 5.47 s | 1 | 0 | – |
| ProfileService | 21.30 s | 21.30 s | 21.30 s | 1 | 0 | – |
| DataStore2, Standard saving | 0.02 s | 0.02 s | 0.02 s | 1 | 0 | – |
Requests per sample, by method. A range means the count varied between samples. 3 methods used.
| Subject | UpdateAsync | GetAsync | GetAsync past the cache | n | Counts |
|---|---|---|---|---|---|
| Geode | 2 | – | 1 | 1 | Same in every sample |
| Geode, mailbox = true | 2 | 2 | 1 | 1 | Same in every sample |
| ProfileStore | 2 | – | – | 1 | Same in every sample |
| ProfileService | 4 | – | – | 1 | Same in every sample |
| DataStore2, Standard saving | – | 1 | – | 1 | Same in every sample |
Throttling
Live Roblox serversA burst of 160 or 161 UpdateAsync calls on throwaway keys uses up the server's request budget, then the library loads, saves and releases one profile back to back. One sample per run.
Load
Shown as a range only: the shortest and longest sample, no median.
Table: Time
| Subject | Min | Max | n | Failed |
|---|---|---|---|---|
| Geode | 32.82 s | 32.82 s | 1 | 0 |
| Geode, mailbox = true | 33.70 s | 33.70 s | 1 | 0 |
| ProfileStore | 31.20 s | 31.20 s | 1 | 0 |
| ProfileService | 31.22 s | 31.22 s | 1 | 0 |
| DataStore2, Standard saving | 31.07 s | 31.07 s | 1 | 0 |
Requests per sample, by method. A range means the count varied between samples. 2 methods used.
| Subject | UpdateAsync | GetAsync | n | Counts |
|---|---|---|---|---|
| Geode | 1 | – | 1 | Same in every sample |
| Geode, mailbox = true | 1 | 1 | 1 | Same in every sample |
| ProfileStore | 2 | – | 1 | Same in every sample |
| ProfileService | 1 | – | 1 | Same in every sample |
| DataStore2, Standard saving | – | 61 | 1 | Same in every sample |
Save
Shown as a range only: the shortest and longest sample, no median.
Table: Time
| Subject | Min | Max | n | Failed |
|---|---|---|---|---|
| Geode | 1.13 s | 1.13 s | 1 | 0 |
| Geode, mailbox = true | 1.23 s | 1.23 s | 1 | 0 |
| ProfileStore | 0.18 s | 0.18 s | 1 | 0 |
| ProfileService | 0.13 s | 0.13 s | 1 | 0 |
| DataStore2, Standard saving | 1.08 s | 1.08 s | 1 | 0 |
Requests per sample, by method. A range means the count varied between samples. 1 method used.
| Subject | UpdateAsync | n | Counts |
|---|---|---|---|
| Geode | 1 | 1 | Same in every sample |
| Geode, mailbox = true | 1 | 1 | Same in every sample |
| ProfileStore | 1 | 1 | Same in every sample |
| ProfileService | 1 | 1 | Same in every sample |
| DataStore2, Standard saving | 1 | 1 | Same in every sample |
Release
Shown as a range only: the shortest and longest sample, no median.
Table: Time
| Subject | Min | Max | n | Failed |
|---|---|---|---|---|
| Geode | 0.25 s | 0.25 s | 1 | 0 |
| Geode, mailbox = true | 0.25 s | 0.25 s | 1 | 0 |
| ProfileStore | 0.17 s | 0.17 s | 1 | 0 |
| ProfileService | 7.05 s | 7.05 s | 1 | 0 |
| DataStore2, Standard saving | 0.12 s | 0.12 s | 1 | 0 |
Requests per sample, by method. A range means the count varied between samples. 1 method used.
| Subject | UpdateAsync | n | Counts |
|---|---|---|---|
| Geode | 1 | 1 | Same in every sample |
| Geode, mailbox = true | 1 | 1 | Same in every sample |
| ProfileStore | 1 | 1 | Same in every sample |
| ProfileService | 1 | 1 | Same in every sample |
| DataStore2, Standard saving | 1 | 1 | Same in every sample |
Geode edit time
Lune, Geode onlyGeode only, in Lune against Geode's test universe on the machine that runs the bench, not on a Roblox server. One loaded profile with the same data as the other suites takes batches of 1000 profile:increment("coins") calls, after one batch that isn't counted. Each edit runs through the profile's transaction pipeline and is recorded for the next save, without a DataStore request. One sample per batch.
Increment
Median (the upright tick) and min to max of every sample (the bar).
Table: Time per edit
| Subject | Median | Min | Max | n |
|---|---|---|---|---|
| Geode | 10.97 µs | 10.79 µs | 11.29 µs | 5 |
Libraries
| Library | Version | Commit | Licence |
|---|---|---|---|
| ProfileStore | no releases, latest commit on main (2025-07-31) | MadStudioRoblox/ProfileStore@45c9847 | Apache-2.0 |
| ProfileService | no releases, latest commit on master (2024-10-13) | MadStudioRoblox/ProfileService@d736800 | Apache-2.0 |
| Lapis | v0.3.3 | nezuo/lapis@f140aca | MIT |
| Promise | v4.0.0, the version Lapis 0.3.3 asks for | evaera/roblox-lua-promise@2c6f433 | MIT |
| DataStore2 | ds2-1.4.0 | Kampfkarren/Roblox@ab81664 | custom: copying and changing allowed, changes to a published game's copy must be shared |
Couldn't run
- Lapis, Load, save and release
- RunService.PostSimulation didn't fire in this task, and Lapis sends its DataStore requests from that event
- Lapis, Server hops
- RunService.PostSimulation didn't fire in this task, and Lapis sends its DataStore requests from that event
- Lapis, Throttling
- RunService.PostSimulation didn't fire in this task, and Lapis sends its DataStore requests from that event
