Skip to content

fix: prevent Onyx.merge from clobbering concurrent Onyx.update writes - #817

Merged
mountiny merged 3 commits into
Expensify:mainfrom
callstack-internal:bugfix/merge-concurrent-onyx-update
Aug 7, 2026
Merged

fix: prevent Onyx.merge from clobbering concurrent Onyx.update writes#817
mountiny merged 3 commits into
Expensify:mainfrom
callstack-internal:bugfix/merge-concurrent-onyx-update

Conversation

@fabioh8010

@fabioh8010 fabioh8010 commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Details

Onyx.merge reads the key with OnyxUtils.get(), computes the whole merged value from whatever that read resolved with, and writes it back through broadcastUpdate -> cache.set(), which is a full replace. The .then() callback does not run the instant get() resolves — microtasks already queued run first — so any write landing in that gap is silently discarded, and Onyx.update's mergeCollection path is exactly such a writer: it updates the same key via cache.merge() and never registers in mergeQueue, so the two never serialize. The practical effect is that a standalone Onyx.merge fired from an Onyx subscriber while an Onyx.update batch is in flight reverts everything that batch wrote to the key; in E/App this dropped the pendingAction: null entries coming from successData and brought back report actions the server had just deleted, leaving deleted expenses visible again offline (Expensify/App#97400).

This PR re-reads the cache at apply time instead of trusting the value get() resolved with, mirroring what OnyxUtils.get already does internally ("prefer cache over stale storage if a concurrent write populated it during the read"), and adds a deterministic regression test under Onyx > merge > concurrency with Onyx.update.

Related Issues

Expensify/App#97400

Linked E/App PR

Expensify/App#97691

Automated Tests

Tests were added.

Manual Tests

Test steps of Expensify/App#97400:

  1. Navigate to Self DM.
  2. Create a manual expense.
  3. Open the just created expense.
  4. Click on "More" > "Split" > Save splits.
  5. Return to chat.
  6. Delete both splits.
  7. Turn to offline mode, assert there are no "ghost" deleted expenses in the chat.
  8. Go back online, assert the same.

Author Checklist

  • I linked the correct issue in the ### Related Issues section above
  • I linked the corresponding Expensify/App PR in the ### Linked E/App PR section above, and verified this change against it (E/App CI passed and manual testing completed)
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android / native
    • Android / Chrome
    • iOS / native
    • iOS / Safari
    • MacOS / Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • If we are not using the full Onyx data that we loaded, I've added the proper selector in order to ensure the component only re-renders when the data it is using changes
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
Screen.Recording.2026-08-03.at.14.56.03.mov
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-08-03.at.14.51.49.mov

@fabioh8010

Copy link
Copy Markdown
Contributor Author

Reassure failure is flaky, ran locally and there are not significant perf regressions

Details

Performance Comparison Report

  • Current: bugfix/merge-concurrent-onyx-update (8f9a5d0) - 2026-08-03 13:46:51Z
  • Baseline: main (1eac2fe) - 2026-08-03 13:44:53Z

Significant Changes To Duration

Show entries
Name Type Duration Count
OnyxUtils keysChanged one call with 10k heavy objects to update 10k subscribers function 4.5 ms → 4.9 ms (+0.4 ms, +8.9%) 🔴 1 → 1
useOnyx misc data in storage and cache render 0.1 ms → 0.1 ms (+0.0 ms, +5.9%) 🔴 1 → 1
OnyxCache captureTask one call capturing one task async function 0.0 ms → 0.0 ms (+0.0 ms, +19.8%) 🔴 1 → 1
utils pick one call passing function condition function 0.0 ms → 0.0 ms (+0.0 ms, +7.1%) 🔴 1 → 1
OnyxUtils getMergeQueuePromise one call function 0.0 ms → 0.0 ms (+0.0 ms, +104.7%) 🔴🔴 1 → 1
OnyxUtils splitCollectionMemberKey one call passing the collection key function 0.0 ms → 0.0 ms (+0.0 ms, +45.9%) 🔴🔴 1 → 1
OnyxUtils getCollectionKeys one call function 0.0 ms → 0.0 ms (+0.0 ms, +51.1%) 🔴🔴 1 → 1
OnyxUtils isCollectionKey one call function 0.0 ms → 0.0 ms (+0.0 ms, +50.0%) 🔴🔴 1 → 1
OnyxUtils getCollectionKey one call function 0.0 ms → 0.0 ms (+0.0 ms, +16.7%) 🔴 1 → 1
OnyxUtils getSnapshotKey one call function 0.0 ms → 0.0 ms (+0.0 ms, +18.7%) 🔴 1 → 1
OnyxUtils getDefaultKeyStates one call function 0.0 ms → 0.0 ms (-0.0 ms, -11.2%) 🟢 1 → 1
OnyxCache hasValueChanged one call checking one key function 0.0 ms → 0.0 ms (-0.0 ms, -32.8%) 🟢 1 → 1
useOnyx multiple calls 3 calls loading from storage render 0.3 ms → 0.3 ms (-0.0 ms, -9.5%) 🟢 2 → 2
OnyxUtils isValidNonEmptyCollectionForMerge one call function 0.3 ms → 0.3 ms (-0.0 ms, -10.8%) 🟢 1 → 1
useOnyx multiple calls 3 calls loading from cache + merges render 0.3 ms → 0.3 ms (-0.0 ms, -10.6%) 🟢 2 → 2
utils fastMerge one call function 2.3 ms → 2.1 ms (-0.1 ms, -6.4%) 🟢 1 → 1
Onyx clear one call with 10k records to clean async function 10.1 ms → 9.4 ms (-0.8 ms, -7.6%) 🟢 1 → 1
Onyx multiSet one call with 10k heavy objects async function 29.5 ms → 27.7 ms (-1.7 ms, -5.9%) 🟢 1 → 1
OnyxConnectionManager fireCallbacks one call firing 10k callbacks function 7.3 ms → 3.3 ms (-4.0 ms, -54.8%) 🟢🟢 1 → 1
Onyx set 10k calls with heavy objects async function 48.2 ms → 42.2 ms (-6.1 ms, -12.6%) 🟢 1 → 1
Onyx merge 10k calls with heavy objects async function 98.5 ms → 89.9 ms (-8.5 ms, -8.7%) 🟢 1 → 1
Onyx mergeCollection one call with 10k heavy objects async function 112.2 ms → 102.7 ms (-9.4 ms, -8.4%) 🟢 1 → 1
Onyx update one call with 5k sets and 5k merges updates async function 134.6 ms → 120.4 ms (-14.3 ms, -10.6%) 🟢 1 → 1
Show details
Name Type Duration Count
OnyxUtils keysChanged one call with 10k heavy objects to update 10k subscribers function Baseline
Mean: 4.5 ms
Stdev: 0.5 ms (11.4%)
Runs: 4.3 4.7 4.6 4.8 4.6 4.7 3.4 4.1 5.1
Warmup runs: 3.7
Removed outliers: 9.6

Current
Mean: 4.9 ms
Stdev: 1.3 ms (27.6%)
Runs: 4.9 4.7 4.7 8.3 3.1 4.0 4.4 4.9 4.8 5.2
Warmup runs: 4.8
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
useOnyx misc data in storage and cache render Baseline
Mean: 0.1 ms
Stdev: 0.0 ms (4.3%)
Runs: 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
Warmup runs: 0.1
Removed outliers: (none)

Current
Mean: 0.1 ms
Stdev: 0.0 ms (5.9%)
Runs: 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
Warmup runs: 0.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Render issues:

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Render issues:
OnyxCache captureTask one call capturing one task async function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (13.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (24.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils pick one call passing function condition function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (5.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (11.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getMergeQueuePromise one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (0.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (76.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils splitCollectionMemberKey one call passing the collection key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (52.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (73.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getCollectionKeys one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (30.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (83.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isCollectionKey one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (0.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (0.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getCollectionKey one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (10.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (63.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getSnapshotKey one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (0.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (21.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getDefaultKeyStates one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (0.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (56.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache hasValueChanged one call checking one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (18.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (17.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
useOnyx multiple calls 3 calls loading from storage render Baseline
Mean: 0.3 ms
Stdev: 0.0 ms (3.1%)
Runs: 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
Warmup runs: 0.3
Removed outliers: (none)

Current
Mean: 0.3 ms
Stdev: 0.0 ms (4.5%)
Runs: 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
Warmup runs: 0.3
Removed outliers: (none)
Baseline
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:

Current
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:
OnyxUtils isValidNonEmptyCollectionForMerge one call function Baseline
Mean: 0.3 ms
Stdev: 0.0 ms (7.9%)
Runs: 0.4 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
Warmup runs: 0.4
Removed outliers: (none)

Current
Mean: 0.3 ms
Stdev: 0.0 ms (8.9%)
Runs: 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.2 0.2 0.2
Warmup runs: 0.4
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
useOnyx multiple calls 3 calls loading from cache + merges render Baseline
Mean: 0.3 ms
Stdev: 0.0 ms (3.3%)
Runs: 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
Warmup runs: 0.3
Removed outliers: (none)

Current
Mean: 0.3 ms
Stdev: 0.0 ms (6.0%)
Runs: 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
Warmup runs: 0.3
Removed outliers: (none)
Baseline
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:

Current
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:
utils fastMerge one call function Baseline
Mean: 2.3 ms
Stdev: 0.1 ms (5.9%)
Runs: 2.5 2.4 2.4 2.3 2.2 2.2 2.2 2.2 2.2
Warmup runs: 2.8
Removed outliers: 6.6

Current
Mean: 2.1 ms
Stdev: 0.0 ms (1.0%)
Runs: 2.2 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.2
Warmup runs: 2.4
Removed outliers: 6.9
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx clear one call with 10k records to clean async function Baseline
Mean: 10.1 ms
Stdev: 1.0 ms (9.6%)
Runs: 10.1 12.5 10.2 9.9 9.4 9.5 9.7 9.6 9.3 11.1
Warmup runs: 10.8
Removed outliers: (none)

Current
Mean: 9.4 ms
Stdev: 0.2 ms (1.9%)
Runs: 9.8 9.5 9.4 9.2 9.3 9.3 9.2 9.3 9.3
Warmup runs: 9.7
Removed outliers: 11.6
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx multiSet one call with 10k heavy objects async function Baseline
Mean: 29.5 ms
Stdev: 0.5 ms (1.5%)
Runs: 30.1 29.4 29.2 29.2 30.4 29.3 29.2 29.1 29.3
Warmup runs: 29.4
Removed outliers: 33.2

Current
Mean: 27.7 ms
Stdev: 2.2 ms (8.0%)
Runs: 33.3 26.3 27.8 25.8 27.8 26.9 28.7 26.1 28.5 26.0
Warmup runs: 37.4
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxConnectionManager fireCallbacks one call firing 10k callbacks function Baseline
Mean: 7.3 ms
Stdev: 4.7 ms (63.7%)
Runs: 3.4 2.8 3.1 3.0 2.9 9.9 9.8 12.5 11.8 13.9
Warmup runs: 2.8
Removed outliers: (none)

Current
Mean: 3.3 ms
Stdev: 0.2 ms (5.0%)
Runs: 3.3 3.3 3.4 3.5 3.3 3.2 3.5 3.1 3.0
Warmup runs: 3.1
Removed outliers: 9.8
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx set 10k calls with heavy objects async function Baseline
Mean: 48.2 ms
Stdev: 1.2 ms (2.6%)
Runs: 47.8 49.6 49.2 48.6 49.2 49.7 47.7 47.0 47.2 46.1
Warmup runs: 48.9
Removed outliers: (none)

Current
Mean: 42.2 ms
Stdev: 0.6 ms (1.4%)
Runs: 42.3 42.3 42.7 41.4 42.9 41.5 42.0 43.1 41.5 41.9
Warmup runs: 43.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx merge 10k calls with heavy objects async function Baseline
Mean: 98.5 ms
Stdev: 3.0 ms (3.1%)
Runs: 95.6 98.2 98.9 99.5 99.2 105.4 98.9 94.7 95.5 98.6
Warmup runs: 102.4
Removed outliers: (none)

Current
Mean: 89.9 ms
Stdev: 1.5 ms (1.7%)
Runs: 92.1 89.8 89.3 90.3 89.4 91.5 87.8 91.9 87.7 89.6
Warmup runs: 91.6
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx mergeCollection one call with 10k heavy objects async function Baseline
Mean: 112.2 ms
Stdev: 1.9 ms (1.7%)
Runs: 114.6 109.3 113.1 109.3 113.7 112.1 112.9 111.3 113.1
Warmup runs: 114.1
Removed outliers: 135.4

Current
Mean: 102.7 ms
Stdev: 1.3 ms (1.2%)
Runs: 104.8 102.6 102.5 102.7 102.3 104.4 103.7 101.8 100.6 101.7
Warmup runs: 102.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx update one call with 5k sets and 5k merges updates async function Baseline
Mean: 134.6 ms
Stdev: 2.9 ms (2.1%)
Runs: 135.5 141.2 132.7 133.9 134.4 135.9 133.3 134.2 129.9 135.6
Warmup runs: 147.5
Removed outliers: (none)

Current
Mean: 120.4 ms
Stdev: 1.2 ms (1.0%)
Runs: 119.5 120.7 118.9 120.1 120.5 119.5 120.7 123.2 119.4 121.2
Warmup runs: 120.6
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Meaningless Changes To Duration

Show entries
Name Type Duration Count
Onyx init one call with 10k records to init async function 138.6 ms → 136.7 ms (-1.9 ms, -1.4%) 1 → 1
Onyx setCollection one call with 10k heavy objects async function 53.8 ms → 54.4 ms (+0.6 ms, +1.1%) 1 → 1
OnyxCache addKey one call adding one key function 0.0 ms → 0.0 ms (-0.0 ms, -26.2%) 🟢 1 → 1
OnyxCache addNullishStorageKey one call adding one key function 0.0 ms → 0.0 ms (+0.0 ms, +13.2%) 1 → 1
OnyxCache clearNullishStorageKeys one call clearing 10k keys function 0.0 ms → 0.0 ms (-0.0 ms, -6.7%) 1 → 1
OnyxCache drop one call dropping one key among 10k ones function 0.0 ms → 0.0 ms (+0.0 ms, +0.6%) 1 → 1
OnyxCache get one call getting one key among 10k ones function 0.0 ms → 0.0 ms (-0.0 ms, -0.6%) 1 → 1
OnyxCache getAllKeys one call getting 10k keys function 0.0 ms → 0.0 ms (+0.0 ms, ±0.0%) 1 → 1
OnyxCache getTaskPromise one call checking one task async function 0.0 ms → 0.0 ms (-0.0 ms, -2.7%) 1 → 1
OnyxCache hasCacheForKey one call checking one key among 10k ones function 0.0 ms → 0.0 ms (-0.0 ms, -2.2%) 1 → 1
OnyxCache hasNullishStorageKey one call checking one key among 10k ones function 0.0 ms → 0.0 ms (-0.0 ms, -15.8%) 🟢 1 → 1
OnyxCache hasPendingTask one call checking one task function 0.0 ms → 0.0 ms (+0.0 ms, +4.1%) 1 → 1
OnyxCache merge one call merging 10k keys function 44.6 ms → 42.6 ms (-2.1 ms, -4.7%) 1 → 1
OnyxCache set one call setting one key function 0.0 ms → 0.0 ms (-0.0 ms, -5.9%) 1 → 1
OnyxCache setAllKeys one call setting 10k keys function 0.6 ms → 0.6 ms (-0.0 ms, -4.2%) 1 → 1
OnyxConnectionManager connect one call async function 0.0 ms → 0.0 ms (-0.0 ms, -23.5%) 🟢 1 → 1
OnyxConnectionManager disconnect one call function 0.0 ms → 0.0 ms (+0.0 ms, +22.9%) 🔴 1 → 1
OnyxConnectionManager disconnectAll one call disconnecting 10k connections function 0.0 ms → 0.0 ms (+0.0 ms, +4.6%) 1 → 1
OnyxConnectionManager generateConnectionID one call function 0.0 ms → 0.0 ms (-0.0 ms, -16.5%) 🟢 1 → 1
OnyxConnectionManager refreshSessionID one call function 0.0 ms → 0.0 ms (-0.0 ms, -1.6%) 1 → 1
OnyxSnapshotCache getCachedResult getting cached result (cache hit) function 0.0 ms → 0.0 ms (-0.0 ms, -38.8%) 🟢 1 → 1
OnyxSnapshotCache getCachedResult getting cached result with 1000 keys in cache function 0.0 ms → 0.0 ms (-0.0 ms, -25.0%) 🟢 1 → 1
OnyxSnapshotCache getCachedResult getting cached result with complex selector (cache hit) function 0.0 ms → 0.0 ms (-0.0 ms, -6.3%) 1 → 1
OnyxSnapshotCache getSelectorId getting ID for cached selector (1000 existing selectors) function 0.0 ms → 0.0 ms (+0.0 ms, +1.6%) 1 → 1
OnyxSnapshotCache getSelectorId getting ID for new selector function 0.0 ms → 0.0 ms (-0.0 ms, -17.4%) 🟢 1 → 1
OnyxSnapshotCache invalidateForKey invalidating collection member key function 0.0 ms → 0.0 ms (+0.0 ms, +6.5%) 1 → 1
OnyxSnapshotCache invalidateForKey invalidating single key (cache hit) function 0.0 ms → 0.0 ms (+0.0 ms, +7.4%) 1 → 1
OnyxSnapshotCache registerConsumer generating 1000 cache keys with different selectors function 0.2 ms → 0.2 ms (+0.0 ms, ±0.0%) 1 → 1
OnyxSnapshotCache registerConsumer generating key for complex selector options function 0.0 ms → 0.0 ms (-0.0 ms, -33.1%) 🟢 1 → 1
OnyxSnapshotCache registerConsumer generating key for selector options function 0.0 ms → 0.0 ms (-0.0 ms, -30.7%) 🟢 1 → 1
OnyxSnapshotCache setCachedResult setting cached result for existing key function 0.0 ms → 0.0 ms (-0.0 ms, -21.0%) 🟢 1 → 1
OnyxSnapshotCache setCachedResult setting cached result for new key function 0.0 ms → 0.0 ms (-0.0 ms, -23.2%) 🟢 1 → 1
OnyxUtils addEvictableKeysToRecentlyAccessedList one call adding 1k keys async function 0.4 ms → 0.4 ms (-0.0 ms, -0.8%) 1 → 1
OnyxUtils addLastAccessedKey one call adding one key function 0.0 ms → 0.0 ms (+0.0 ms, +1.1%) 1 → 1
OnyxUtils broadcastUpdate one call function 0.0 ms → 0.0 ms (-0.0 ms, -3.6%) 1 → 1
OnyxUtils deleteKeyBySubscriptions one call function 0.0 ms → 0.0 ms (+0.0 ms, +2.0%) 1 → 1
OnyxUtils doAllCollectionItemsBelongToSameParent one call checking 10k heavy objects function 0.4 ms → 0.4 ms (+0.0 ms, +3.1%) 1 → 1
OnyxUtils get 10k calls with heavy objects async function 18.6 ms → 18.7 ms (+0.1 ms, +0.6%) 1 → 1
OnyxUtils getAllKeys one call with 50k heavy objects async function 3.1 ms → 3.0 ms (-0.1 ms, -1.7%) 1 → 1
OnyxUtils getCachedCollection one call retrieving a collection with 5k heavy objects function 0.0 ms → 0.0 ms (+0.0 ms, +7.4%) 1 → 1
OnyxUtils getCollectionDataAndSendAsObject one call with 10k heavy objects async function 4.6 ms → 4.6 ms (-0.1 ms, -1.3%) 1 → 1
OnyxUtils getDeferredInitTask one call function 0.0 ms → 0.0 ms (-0.0 ms, -19.9%) 🟢 1 → 1
OnyxUtils getMergeQueue one call function 0.0 ms → 0.0 ms (-0.0 ms, -15.7%) 🟢 1 → 1
OnyxUtils getSkippableCollectionMemberIDs one call function 0.0 ms → 0.0 ms (+0.0 ms, +3.0%) 1 → 1
OnyxUtils hasPendingMergeForKey one call to look through 10k pending merges function 0.0 ms → 0.0 ms (+0.0 ms, +14.6%) 1 → 1
OnyxUtils initializeWithDefaultKeyStates one call initializing 10k heavy objects async function 146.7 ms → 143.7 ms (-3.0 ms, -2.0%) 1 → 1
OnyxUtils initStoreValues one call with 50k heavy objects function 0.0 ms → 0.0 ms (-0.0 ms, -6.5%) 1 → 1
OnyxUtils isCollectionMemberKey one call with correct key function 0.0 ms → 0.0 ms (-0.0 ms, -0.9%) 1 → 1
OnyxUtils isCollectionMemberKey one call with wrong key function 0.0 ms → 0.0 ms (+0.0 ms, +26.8%) 🔴 1 → 1
OnyxUtils isKeyMatch one call passing collection key function 0.0 ms → 0.0 ms (+0.0 ms, +11.5%) 1 → 1
OnyxUtils isKeyMatch one call passing normal key function 0.0 ms → 0.0 ms (-0.0 ms, -2.9%) 1 → 1
OnyxUtils isRamOnlyKey one call for RAM-only collection key function 0.0 ms → 0.0 ms (+0.0 ms, +14.5%) 1 → 1
OnyxUtils isRamOnlyKey one call for RAM-only collection member key function 0.0 ms → 0.0 ms (-0.0 ms, -12.3%) 1 → 1
OnyxUtils isRamOnlyKey one call for RAM-only key function 0.0 ms → 0.0 ms (-0.0 ms, -54.2%) 🟢 1 → 1
OnyxUtils isSafeEvictionKey one call checking one key function 0.0 ms → 0.0 ms (+0.0 ms, +2.5%) 1 → 1
OnyxUtils keyChanged one call with one heavy object to update 10k subscribers function 5.9 ms → 5.9 ms (+0.0 ms, ±0.0%) 1 → 1
OnyxUtils mergeChanges one call merging 5 changes function 0.0 ms → 0.0 ms (-0.0 ms, -0.9%) 1 → 1
OnyxUtils multiGet one call getting 10k heavy objects from cache async function 1.9 ms → 1.9 ms (-0.1 ms, -3.2%) 1 → 1
OnyxUtils multiGet one call getting 10k heavy objects from storage async function 42.2 ms → 41.8 ms (-0.3 ms, -0.8%) 1 → 1
OnyxUtils partialSetCollection one call with 10k heavy objects async function 25.4 ms → 25.2 ms (-0.2 ms, -0.6%) 1 → 1
OnyxUtils prepareKeyValuePairsForStorage one call with 10k heavy objects function 1.8 ms → 1.8 ms (-0.0 ms, -1.3%) 1 → 1
OnyxUtils reduceCollectionWithSelector one call with 10k heavy objects function 2.1 ms → 2.1 ms (+0.0 ms, +1.4%) 1 → 1
OnyxUtils remove 10k calls async function 12.7 ms → 12.4 ms (-0.3 ms, -2.2%) 1 → 1
OnyxUtils removeLastAccessedKey one call removing one key function 0.0 ms → 0.0 ms (-0.0 ms, -15.8%) 🟢 1 → 1
OnyxUtils reportStorageQuota one call async function 0.0 ms → 0.0 ms (-0.0 ms, -3.9%) 1 → 1
OnyxUtils retryOperation one call async function 0.0 ms → 0.0 ms (+0.0 ms, +8.6%) 1 → 1
OnyxUtils sendActionToDevTools one call function 0.0 ms → 0.0 ms (+0.0 ms, +4.8%) 1 → 1
OnyxUtils sendDataToConnection one call with 10k heavy objects function 0.4 ms → 0.4 ms (-0.0 ms, -1.1%) 1 → 1
OnyxUtils setSkippableCollectionMemberIDs one call function 0.0 ms → 0.0 ms (+0.0 ms, +1.4%) 1 → 1
OnyxUtils splitCollectionMemberKey one call without passing the collection key function 0.0 ms → 0.0 ms (-0.0 ms, -26.6%) 🟢 1 → 1
OnyxUtils storeKeyBySubscriptions one call function 0.0 ms → 0.0 ms (+0.0 ms, +15.7%) 🔴 1 → 1
OnyxUtils subscribeToKey one call subscribing to a single key async function 3.1 ms → 3.0 ms (-0.1 ms, -2.6%) 1 → 1
OnyxUtils subscribeToKey one call subscribing to a whole collection of 10k heavy objects async function 45.1 ms → 44.7 ms (-0.4 ms, -0.9%) 1 → 1
OnyxUtils tryGetCachedValue one call passing collection key function 0.0 ms → 0.0 ms (-0.0 ms, -19.0%) 🟢 1 → 1
OnyxUtils tryGetCachedValue one call passing normal key function 0.0 ms → 0.0 ms (-0.0 ms, -3.9%) 1 → 1
OnyxUtils tupleGet one call getting 10k heavy objects function 1.8 ms → 1.8 ms (+0.0 ms, ±0.0%) 1 → 1
OnyxUtils unsubscribeFromKey one call function 0.0 ms → 0.0 ms (-0.0 ms, -1.6%) 1 → 1
OnyxUtils updateSnapshots one call with 100 updates async function 0.9 ms → 0.9 ms (-0.0 ms, -2.4%) 1 → 1
Str guid one call function 0.0 ms → 0.0 ms (+0.0 ms, +8.0%) 1 → 1
Str result one call with function parameter and args function 0.0 ms → 0.0 ms (-0.0 ms, -5.7%) 1 → 1
Str result one call with string parameter function 0.0 ms → 0.0 ms (+0.0 ms, +33.6%) 🔴 1 → 1
Str startsWith one call function 0.0 ms → 0.0 ms (-0.0 ms, -20.0%) 🟢 1 → 1
useOnyx misc data in storage but not yet in cache render 0.2 ms → 0.2 ms (-0.0 ms, -3.1%) 2 → 2
useOnyx misc multiple merge operations render 0.2 ms → 0.2 ms (-0.0 ms, -3.2%) 2 → 2
useOnyx misc no data in storage/cache render 0.2 ms → 0.2 ms (-0.0 ms, -8.3%) 2 → 2
useOnyx multiple calls 3 calls loading from cache render 0.2 ms → 0.2 ms (+0.0 ms, ±0.0%) 1 → 1
useOnyx selector updating data that is not used by selector render 0.1 ms → 0.1 ms (+0.0 ms, +3.9%) 1 → 1
useOnyx selector updating data that is used by selector render 0.2 ms → 0.2 ms (-0.0 ms, -2.2%) 2 → 2
utils checkCompatibilityWithExistingValue one call function 0.0 ms → 0.0 ms (-0.0 ms, ±0.0%) 1 → 1
utils formatActionName one call function 0.0 ms → 0.0 ms (-0.0 ms, -10.1%) 1 → 1
utils isEmptyObject one call with one heavy object function 0.0 ms → 0.0 ms (-0.0 ms, -12.5%) 1 → 1
utils omit one call passing function condition function 0.0 ms → 0.0 ms (-0.0 ms, ±0.0%) 1 → 1
utils omit one call passing string array condition function 0.0 ms → 0.0 ms (-0.0 ms, -0.9%) 1 → 1
utils omit one call passing string condition function 0.0 ms → 0.0 ms (-0.0 ms, -2.5%) 1 → 1
utils pick one call passing string array condition function 0.0 ms → 0.0 ms (+0.0 ms, ±0.0%) 1 → 1
utils pick one call passing string condition function 0.0 ms → 0.0 ms (+0.0 ms, +3.0%) 1 → 1
utils removeNestedNullValues one call function 0.0 ms → 0.0 ms (+0.0 ms, +9.0%) 1 → 1
Show details
Name Type Duration Count
Onyx init one call with 10k records to init async function Baseline
Mean: 138.6 ms
Stdev: 1.2 ms (0.8%)
Runs: 141.0 138.6 137.6 138.4 138.0 138.0 138.1 138.8 137.3 140.3
Warmup runs: 74.1
Removed outliers: (none)

Current
Mean: 136.7 ms
Stdev: 3.0 ms (2.2%)
Runs: 136.3 133.7 134.3 134.2 134.7 139.2 136.9 137.2 143.8 137.1
Warmup runs: 72.3
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Onyx setCollection one call with 10k heavy objects async function Baseline
Mean: 53.8 ms
Stdev: 2.2 ms (4.1%)
Runs: 54.9 51.6 52.3 50.9 53.9 55.7 53.7 52.7 53.6 58.5
Warmup runs: 54.0
Removed outliers: (none)

Current
Mean: 54.4 ms
Stdev: 2.5 ms (4.6%)
Runs: 54.0 50.6 51.7 58.1 55.6 54.4 53.7 58.6 54.3 52.7
Warmup runs: 51.3
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache addKey one call adding one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (41.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (19.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache addNullishStorageKey one call adding one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (22.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (35.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache clearNullishStorageKeys one call clearing 10k keys function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (12.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (10.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache drop one call dropping one key among 10k ones function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (23.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (15.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache get one call getting one key among 10k ones function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (20.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (16.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache getAllKeys one call getting 10k keys function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (11.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (18.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache getTaskPromise one call checking one task async function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (10.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (17.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache hasCacheForKey one call checking one key among 10k ones function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (23.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (11.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache hasNullishStorageKey one call checking one key among 10k ones function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (44.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (16.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache hasPendingTask one call checking one task function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (21.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (27.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache merge one call merging 10k keys function Baseline
Mean: 44.6 ms
Stdev: 0.7 ms (1.7%)
Runs: 45.3 44.9 45.3 45.0 44.9 45.0 44.8 44.7 43.1 43.5
Warmup runs: 44.4
Removed outliers: (none)

Current
Mean: 42.6 ms
Stdev: 0.9 ms (2.0%)
Runs: 43.5 42.9 43.3 42.8 42.7 41.0 40.9 42.8 42.7 42.8
Warmup runs: 43.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache set one call setting one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (23.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (14.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxCache setAllKeys one call setting 10k keys function Baseline
Mean: 0.6 ms
Stdev: 0.0 ms (2.6%)
Runs: 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6
Warmup runs: 0.7
Removed outliers: 2.5

Current
Mean: 0.6 ms
Stdev: 0.0 ms (2.9%)
Runs: 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6
Warmup runs: 0.6
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxConnectionManager connect one call async function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (40.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (26.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxConnectionManager disconnect one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (38.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (58.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxConnectionManager disconnectAll one call disconnecting 10k connections function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (24.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (22.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxConnectionManager generateConnectionID one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (68.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (55.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxConnectionManager refreshSessionID one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (24.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (16.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache getCachedResult getting cached result (cache hit) function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (73.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (0.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache getCachedResult getting cached result with 1000 keys in cache function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (56.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (64.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache getCachedResult getting cached result with complex selector (cache hit) function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (58.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (0.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache getSelectorId getting ID for cached selector (1000 existing selectors) function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (47.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (39.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache getSelectorId getting ID for new selector function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (96.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (59.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache invalidateForKey invalidating collection member key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (31.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (33.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache invalidateForKey invalidating single key (cache hit) function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (45.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (41.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache registerConsumer generating 1000 cache keys with different selectors function Baseline
Mean: 0.2 ms
Stdev: 0.0 ms (6.1%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 0.3
Removed outliers: (none)

Current
Mean: 0.2 ms
Stdev: 0.0 ms (2.8%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 0.3
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache registerConsumer generating key for complex selector options function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (69.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (39.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache registerConsumer generating key for selector options function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (93.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (41.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache setCachedResult setting cached result for existing key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (44.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (0.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxSnapshotCache setCachedResult setting cached result for new key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (72.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (39.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils addEvictableKeysToRecentlyAccessedList one call adding 1k keys async function Baseline
Mean: 0.4 ms
Stdev: 0.0 ms (10.2%)
Runs: 0.4 0.4 0.4 0.4 0.4 0.3 0.3 0.3 0.3 0.3
Warmup runs: 0.4
Removed outliers: (none)

Current
Mean: 0.4 ms
Stdev: 0.0 ms (8.0%)
Runs: 0.4 0.4 0.4 0.3 0.4 0.3 0.4 0.4 0.3 0.3
Warmup runs: 0.4
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils addLastAccessedKey one call adding one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (40.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (59.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils broadcastUpdate one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (17.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (16.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils deleteKeyBySubscriptions one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (31.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (23.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils doAllCollectionItemsBelongToSameParent one call checking 10k heavy objects function Baseline
Mean: 0.4 ms
Stdev: 0.0 ms (0.4%)
Runs: 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4
Warmup runs: 0.4
Removed outliers: 0.4

Current
Mean: 0.4 ms
Stdev: 0.0 ms (2.3%)
Runs: 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4
Warmup runs: 0.4
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils get 10k calls with heavy objects async function Baseline
Mean: 18.6 ms
Stdev: 1.8 ms (9.7%)
Runs: 19.8 21.3 17.1 17.5 20.7 17.2 17.5 20.7 16.9 17.1
Warmup runs: 18.4
Removed outliers: (none)

Current
Mean: 18.7 ms
Stdev: 2.1 ms (11.1%)
Runs: 20.7 17.0 17.0 20.9 21.4 16.9 18.2 21.1 16.7 16.9
Warmup runs: 18.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getAllKeys one call with 50k heavy objects async function Baseline
Mean: 3.1 ms
Stdev: 0.1 ms (1.8%)
Runs: 3.1 3.0 3.1 3.0 3.1 3.1 3.1 3.0 3.1 2.9
Warmup runs: 3.2
Removed outliers: (none)

Current
Mean: 3.0 ms
Stdev: 0.1 ms (2.7%)
Runs: 3.2 3.0 3.0 2.9 2.9 3.0 3.0 3.0 3.0 2.9
Warmup runs: 3.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getCachedCollection one call retrieving a collection with 5k heavy objects function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (52.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (37.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getCollectionDataAndSendAsObject one call with 10k heavy objects async function Baseline
Mean: 4.6 ms
Stdev: 0.1 ms (1.1%)
Runs: 4.6 4.6 4.6 4.6 4.7 4.6 4.5 4.6 4.7 4.7
Warmup runs: 5.0
Removed outliers: (none)

Current
Mean: 4.6 ms
Stdev: 0.1 ms (1.7%)
Runs: 4.5 4.7 4.7 4.6 4.6 4.5 4.5 4.6 4.6
Warmup runs: 7.6
Removed outliers: 7.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getDeferredInitTask one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (30.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (0.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getMergeQueue one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (38.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (0.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils getSkippableCollectionMemberIDs one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (71.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (56.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils hasPendingMergeForKey one call to look through 10k pending merges function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (56.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (75.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils initializeWithDefaultKeyStates one call initializing 10k heavy objects async function Baseline
Mean: 146.7 ms
Stdev: 0.7 ms (0.5%)
Runs: 147.7 147.2 146.5 146.7 145.6 145.4 146.4 147.3 146.7 147.5
Warmup runs: 137.8
Removed outliers: (none)

Current
Mean: 143.7 ms
Stdev: 1.4 ms (0.9%)
Runs: 143.2 143.1 141.7 142.7 142.9 143.1 143.9 145.8 145.5 145.2
Warmup runs: 133.8
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils initStoreValues one call with 50k heavy objects function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (9.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (10.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isCollectionMemberKey one call with correct key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (52.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (61.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isCollectionMemberKey one call with wrong key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (58.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (81.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isKeyMatch one call passing collection key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (66.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (58.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isKeyMatch one call passing normal key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (49.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (57.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isRamOnlyKey one call for RAM-only collection key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (72.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (59.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isRamOnlyKey one call for RAM-only collection member key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (55.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (62.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isRamOnlyKey one call for RAM-only key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (85.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (32.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils isSafeEvictionKey one call checking one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (35.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (40.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils keyChanged one call with one heavy object to update 10k subscribers function Baseline
Mean: 5.9 ms
Stdev: 2.4 ms (41.0%)
Runs: 4.2 9.7 5.0 4.0 9.1 4.5 4.1 9.1 4.9 4.0
Warmup runs: 4.7
Removed outliers: (none)

Current
Mean: 5.9 ms
Stdev: 2.3 ms (39.5%)
Runs: 9.6 4.6 4.3 10.2 5.0 4.3 4.1 4.8 4.4 7.3
Warmup runs: 4.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils mergeChanges one call merging 5 changes function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (3.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (3.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils multiGet one call getting 10k heavy objects from cache async function Baseline
Mean: 1.9 ms
Stdev: 0.1 ms (3.2%)
Runs: 2.0 2.0 2.0 2.0 2.0 1.9 1.9 2.1 1.9 1.8
Warmup runs: 2.0
Removed outliers: (none)

Current
Mean: 1.9 ms
Stdev: 0.0 ms (1.8%)
Runs: 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.8
Warmup runs: 1.9
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils multiGet one call getting 10k heavy objects from storage async function Baseline
Mean: 42.2 ms
Stdev: 1.0 ms (2.4%)
Runs: 40.9 43.0 42.9 42.8 42.9 42.1 42.1 40.8 40.7 43.4
Warmup runs: 43.1
Removed outliers: (none)

Current
Mean: 41.8 ms
Stdev: 1.4 ms (3.4%)
Runs: 40.7 40.4 43.2 44.4 42.7 41.4 41.4 40.4 40.5 43.1
Warmup runs: 42.9
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils partialSetCollection one call with 10k heavy objects async function Baseline
Mean: 25.4 ms
Stdev: 0.9 ms (3.6%)
Runs: 24.9 24.5 24.6 24.4 26.4 25.7 26.0 26.2 26.5 24.3
Warmup runs: 25.1
Removed outliers: (none)

Current
Mean: 25.2 ms
Stdev: 1.1 ms (4.3%)
Runs: 24.3 26.5 26.3 25.6 26.2 26.4 24.1 24.2 24.1 24.4
Warmup runs: 25.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils prepareKeyValuePairsForStorage one call with 10k heavy objects function Baseline
Mean: 1.8 ms
Stdev: 0.0 ms (1.8%)
Runs: 1.7 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8
Warmup runs: 1.8
Removed outliers: (none)

Current
Mean: 1.8 ms
Stdev: 0.0 ms (1.4%)
Runs: 1.8 1.8 1.8 1.8 1.7 1.8 1.8 1.8 1.7 1.8
Warmup runs: 1.8
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils reduceCollectionWithSelector one call with 10k heavy objects function Baseline
Mean: 2.1 ms
Stdev: 0.0 ms (1.9%)
Runs: 2.2 2.2 2.1 2.1 2.1 2.1 2.1 2.1 2.0 2.1
Warmup runs: 2.7
Removed outliers: (none)

Current
Mean: 2.1 ms
Stdev: 0.0 ms (1.4%)
Runs: 2.2 2.2 2.1 2.1 2.1 2.1 2.1 2.1 2.2 2.1
Warmup runs: 2.8
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils remove 10k calls async function Baseline
Mean: 12.7 ms
Stdev: 0.8 ms (6.4%)
Runs: 12.4 12.6 12.3 12.4 12.8 12.5 12.1 12.5 14.8
Warmup runs: 12.8
Removed outliers: 15.6

Current
Mean: 12.4 ms
Stdev: 0.2 ms (1.4%)
Runs: 12.3 12.5 12.2 12.7 12.4 12.5 12.6 12.2
Warmup runs: 12.7
Removed outliers: 15.6 15.5
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils removeLastAccessedKey one call removing one key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (66.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (46.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils reportStorageQuota one call async function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (56.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (49.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils retryOperation one call async function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (38.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (45.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils sendActionToDevTools one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (42.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (47.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils sendDataToConnection one call with 10k heavy objects function Baseline
Mean: 0.4 ms
Stdev: 0.0 ms (11.4%)
Runs: 0.4 0.5 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4
Warmup runs: 0.6
Removed outliers: (none)

Current
Mean: 0.4 ms
Stdev: 0.1 ms (15.6%)
Runs: 0.5 0.4 0.3 0.4 0.4 0.4 0.4 0.3 0.4 0.4
Warmup runs: 0.6
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils setSkippableCollectionMemberIDs one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (31.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (38.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils splitCollectionMemberKey one call without passing the collection key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (78.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (37.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils storeKeyBySubscriptions one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (57.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (48.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils subscribeToKey one call subscribing to a single key async function Baseline
Mean: 3.1 ms
Stdev: 0.1 ms (2.0%)
Runs: 3.1 3.1 3.1 3.1 3.0 3.0 3.1 3.1 3.1 3.0
Warmup runs: 3.1
Removed outliers: (none)

Current
Mean: 3.0 ms
Stdev: 0.0 ms (1.5%)
Runs: 3.1 3.0 3.0 3.0 2.9 2.9 3.0 3.0 2.9 3.0
Warmup runs: 3.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils subscribeToKey one call subscribing to a whole collection of 10k heavy objects async function Baseline
Mean: 45.1 ms
Stdev: 0.8 ms (1.7%)
Runs: 45.6 45.4 45.6 43.4 45.2 43.9 45.7 45.3 45.4 45.5
Warmup runs: 46.1
Removed outliers: (none)

Current
Mean: 44.7 ms
Stdev: 1.0 ms (2.1%)
Runs: 44.9 45.0 45.0 42.6 45.3 43.3 45.1 45.3 45.5 45.1
Warmup runs: 46.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils tryGetCachedValue one call passing collection key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (65.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (44.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils tryGetCachedValue one call passing normal key function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (53.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (58.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils tupleGet one call getting 10k heavy objects function Baseline
Mean: 1.8 ms
Stdev: 0.0 ms (2.5%)
Runs: 1.7 1.7 1.8 1.7 1.8 1.8 1.7 1.8 1.8 1.8
Warmup runs: 1.9
Removed outliers: (none)

Current
Mean: 1.8 ms
Stdev: 0.1 ms (3.0%)
Runs: 1.8 1.8 1.9 1.7 1.8 1.8 1.7 1.7 1.8 1.7
Warmup runs: 1.9
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils unsubscribeFromKey one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (35.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (35.7%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
OnyxUtils updateSnapshots one call with 100 updates async function Baseline
Mean: 0.9 ms
Stdev: 0.0 ms (1.6%)
Runs: 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9
Warmup runs: 2.1
Removed outliers: (none)

Current
Mean: 0.9 ms
Stdev: 0.0 ms (3.3%)
Runs: 0.9 0.9 0.9 0.9 0.9 0.8 0.9 0.9 0.9 0.9
Warmup runs: 2.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Str guid one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (11.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (18.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Str result one call with function parameter and args function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (64.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (64.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Str result one call with string parameter function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (66.0%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (82.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Str startsWith one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (68.1%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (34.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
useOnyx misc data in storage but not yet in cache render Baseline
Mean: 0.2 ms
Stdev: 0.0 ms (3.2%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 0.2
Removed outliers: (none)

Current
Mean: 0.2 ms
Stdev: 0.0 ms (3.9%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 0.2
Removed outliers: (none)
Baseline
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:

Current
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:
useOnyx misc multiple merge operations render Baseline
Mean: 0.2 ms
Stdev: 0.0 ms (4.2%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.1 0.2 0.2 0.2 0.2
Warmup runs: 0.2
Removed outliers: (none)

Current
Mean: 0.2 ms
Stdev: 0.0 ms (7.0%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.1
Warmup runs: 0.2
Removed outliers: (none)
Baseline
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:

Current
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:
useOnyx misc no data in storage/cache render Baseline
Mean: 0.2 ms
Stdev: 0.0 ms (14.8%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 473.7
Removed outliers: (none)

Current
Mean: 0.2 ms
Stdev: 0.0 ms (17.4%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.1
Warmup runs: 38.5
Removed outliers: (none)
Baseline
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:

Current
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:
useOnyx multiple calls 3 calls loading from cache render Baseline
Mean: 0.2 ms
Stdev: 0.0 ms (5.9%)
Runs: 0.2 0.2 0.1 0.2 0.1 0.1 0.2 0.2 0.1 0.1
Warmup runs: 0.2
Removed outliers: (none)

Current
Mean: 0.2 ms
Stdev: 0.0 ms (2.9%)
Runs: 0.2 0.2 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.1
Warmup runs: 0.2
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Render issues:

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Render issues:
useOnyx selector updating data that is not used by selector render Baseline
Mean: 0.1 ms
Stdev: 0.0 ms (5.1%)
Runs: 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
Warmup runs: 0.1
Removed outliers: (none)

Current
Mean: 0.1 ms
Stdev: 0.0 ms (3.8%)
Runs: 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
Warmup runs: 0.1
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Render issues:

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
Render issues:
useOnyx selector updating data that is used by selector render Baseline
Mean: 0.2 ms
Stdev: 0.0 ms (3.3%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 0.2
Removed outliers: (none)

Current
Mean: 0.2 ms
Stdev: 0.0 ms (2.3%)
Runs: 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
Warmup runs: 0.2
Removed outliers: (none)
Baseline
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:

Current
Mean: 2
Stdev: 0 (0.0%)
Runs: 2 2 2 2 2 2 2 2 2 2
Render issues:
utils checkCompatibilityWithExistingValue one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (49.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (64.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils formatActionName one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (41.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (40.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0 0.0
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils isEmptyObject one call with one heavy object function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (82.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (72.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils omit one call passing function condition function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (9.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (8.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils omit one call passing string array condition function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (9.3%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (6.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils omit one call passing string condition function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (12.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (8.6%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils pick one call passing string array condition function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (13.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (9.5%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils pick one call passing string condition function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (6.4%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)

Current
Mean: 0.0 ms
Stdev: 0.0 ms (7.9%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1
utils removeNestedNullValues one call function Baseline
Mean: 0.0 ms
Stdev: 0.0 ms (13.2%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: 0.0 0.0

Current
Mean: 0.0 ms
Stdev: 0.0 ms (23.8%)
Runs: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Warmup runs: 0.0
Removed outliers: (none)
Baseline
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Current
Mean: 1
Stdev: 0 (0.0%)
Runs: 1 1 1 1 1 1 1 1 1 1

Render Count Changes

There are no entries

Render Issues

There are no entries

Added Entries

There are no entries

Removed Entries

There are no entries

@fabioh8010
fabioh8010 marked this pull request as ready for review August 3, 2026 14:48
@fabioh8010
fabioh8010 requested a review from a team as a code owner August 3, 2026 14:49
@melvin-bot
melvin-bot Bot requested review from Gonals and removed request for a team August 3, 2026 14:49

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8f9a5d046b

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread lib/Onyx.ts
// Other writers (notably Onyx.update's mergeCollection path, which doesn't participate in mergeQueue)
// can land between get() resolving and this callback running. Applying the delta on top of the value
// captured back then and broadcasting it would overwrite those writes wholesale, so re-read the cache.
const existingValue = cache.hasCacheForKey(key) ? (cache.get(key) as OnyxInput<TKey> | undefined) : valueFromGet;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve concurrent removals instead of stale reads

When the concurrent Onyx.update removes the same collection member while this merge's get() is outstanding, partialSetCollection/mergeCollectionWithPatches calls remove(), which only cache.drop()s the key, so hasCacheForKey(key) is false here. This then falls back to the stale valueFromGet and applyMerge() writes that old object back with the new delta, resurrecting a record that the update just deleted (the same class of race this change is trying to fix for deleted report actions).

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's valid concern that Claude already raised to me, though it's a pre-existing behaviour – we are not introducing this issue here.
It can be further explored in a separate issue in my opinion

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fabioh8010 can you create an issue for that if you think its worth pursuing

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread tests/unit/onyxTest.ts Outdated
Gonals
Gonals previously approved these changes Aug 3, 2026
@mountiny
mountiny self-requested a review August 3, 2026 15:23
Comment thread lib/Onyx.ts
// Other writers (notably Onyx.update's mergeCollection path, which doesn't participate in mergeQueue)
// can land between get() resolving and this callback running. Applying the delta on top of the value
// captured back then and broadcasting it would overwrite those writes wholesale, so re-read the cache.
const existingValue = cache.hasCacheForKey(key) ? (cache.get(key) as OnyxInput<TKey> | undefined) : valueFromGet;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fabioh8010 can you create an issue for that if you think its worth pursuing

@mountiny
mountiny merged commit cabb7a6 into Expensify:main Aug 7, 2026
18 of 20 checks passed
@os-botify

os-botify Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

🚀 Published to npm in 3.0.98 🎉

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants