Skip to content

[FIX]: useQueries have quadratic performance in relation to the number of queries - #8641

Merged
TkDodo merged 2 commits into
TanStack:mainfrom
joseph0926:fix/use-queries
Feb 16, 2025
Merged

[FIX]: useQueries have quadratic performance in relation to the number of queries#8641
TkDodo merged 2 commits into
TanStack:mainfrom
joseph0926:fix/use-queries

Conversation

@joseph0926

Copy link
Copy Markdown
Contributor

Tasks

Issue
Comment

Modification

We changed the code so that instead of recalculating the matching observers every time in the trackResult function, we compute the matches once and pass them in. In getOptimisticResult and notify, we now use the precomputed matches instead of calling findMatchingObservers again. This reduces redundant computations (avoiding O(N²) behavior) while keeping the overall functionality the same.

etc,,,

Before modification (500 queries -> Approximately 4500 calls)

스크린샷 2025-02-13 오전 8 28 15

After modification (500 queries -> Approximately 2000 calls)

스크린샷 2025-02-13 오전 9 19 55

Let us know if you have any issues.
We've tried to keep the original code as unaffected as possible.

Test

You can try running the test code below after switching findMatchingObservers to “public”.

import{QueriesObserver,QueryCache,QueryClient}from'@tanstack/query-core'import{waitFor}from'@testing-library/react'import{describe,expect,it}from'vitest'import{useQueries}from'../..'import{queryKey,renderWithClient,sleep}from'../utils'describe('useQueries O(N²) regression check',()=>{it('should not call #findMatchingObservers excessively with heavy load (500 queries)',async()=>{constqueryCache=newQueryCache()constqueryClient=newQueryClient({ queryCache })constoriginalFn=QueriesObserver.prototype.findMatchingObserversletcallCount=0QueriesObserver.prototype.findMatchingObservers=function(
...args: Array<any>){callCount++returnoriginalFn.apply(this,args)}console.log(QueriesObserver.prototype)functionPage(){constsize=500constkey=queryKey()constqueries=Array.from({length: size},(_,i)=>({queryKey: [key,i],queryFn: async()=>{awaitsleep(1+Math.random()*5)return`Result ${i}`},}))useQueries({ queries })return<div>Heavyqueriestest</div>}constrendered=renderWithClient(queryClient,<Page/>)awaitwaitFor(()=>rendered.getByText('Heavy queries test'))awaitsleep(1000)console.log('findMatchingObservers call count:',callCount)expect(callCount).toBeLessThan(500);(QueriesObserver.prototypeasany)['#findMatchingObservers']=originalFn})})

@nx-cloud

nx-cloudBot commented Feb 16, 2025

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit 4999cce.

CommandStatusDurationResult
nx affected --targets=test:sherif,test:knip,tes...✅ Succeeded5m 15sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 58sView ↗

☁️ Nx Cloud last updated this comment at 2025-02-16 12:34:49 UTC

@pkg-pr-new

Copy link
Copy Markdown

Open in Stackblitz

More templates

@tanstack/angular-query-devtools-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-devtools-experimental@8641

@tanstack/eslint-plugin-query

npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@8641

@tanstack/angular-query-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-experimental@8641

@tanstack/query-async-storage-persister

npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@8641

@tanstack/query-broadcast-client-experimental

npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@8641

@tanstack/query-core

npm i https://pkg.pr.new/@tanstack/query-core@8641

@tanstack/query-devtools

npm i https://pkg.pr.new/@tanstack/query-devtools@8641

@tanstack/query-persist-client-core

npm i https://pkg.pr.new/@tanstack/query-persist-client-core@8641

@tanstack/query-sync-storage-persister

npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@8641

@tanstack/react-query

npm i https://pkg.pr.new/@tanstack/react-query@8641

@tanstack/react-query-next-experimental

npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@8641

@tanstack/react-query-devtools

npm i https://pkg.pr.new/@tanstack/react-query-devtools@8641

@tanstack/react-query-persist-client

npm i https://pkg.pr.new/@tanstack/react-query-persist-client@8641

@tanstack/solid-query

npm i https://pkg.pr.new/@tanstack/solid-query@8641

@tanstack/solid-query-devtools

npm i https://pkg.pr.new/@tanstack/solid-query-devtools@8641

@tanstack/solid-query-persist-client

npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@8641

@tanstack/svelte-query

npm i https://pkg.pr.new/@tanstack/svelte-query@8641

@tanstack/svelte-query-devtools

npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@8641

@tanstack/svelte-query-persist-client

npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@8641

@tanstack/vue-query

npm i https://pkg.pr.new/@tanstack/vue-query@8641

@tanstack/vue-query-devtools

npm i https://pkg.pr.new/@tanstack/vue-query-devtools@8641

commit: 4999cce

@codecov

codecovBot commented Feb 16, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 80.00000% with 1 line in your changes missing coverage. Please review.

Project coverage is 63.07%. Comparing base (5426e6c) to head (4999cce).
Report is 2 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@ Coverage Diff @@## main #8641 +/- ##
===========================================
+ Coverage 46.24% 63.07% +16.83% 
===========================================
Files 199 135 -64 Lines 7532 4837 -2695 Branches 1722 1356 -366 ===========================================
- Hits 3483 3051 -432 + Misses 3670 1542 -2128 + Partials 379 244 -135 
ComponentsCoverage Δ
@tanstack/angular-query-devtools-experimental∅ <ø> (∅)
@tanstack/angular-query-experimental88.65% <ø> (ø)
@tanstack/eslint-plugin-query∅ <ø> (∅)
@tanstack/query-async-storage-persister43.85% <ø> (ø)
@tanstack/query-broadcast-client-experimental∅ <ø> (∅)
@tanstack/query-codemods∅ <ø> (∅)
@tanstack/query-core94.16% <80.00%> (+<0.01%)⬆️
@tanstack/query-devtools4.78% <ø> (ø)
@tanstack/query-persist-client-core57.73% <ø> (ø)
@tanstack/query-sync-storage-persister84.61% <ø> (ø)
@tanstack/react-query95.95% <ø> (ø)
@tanstack/react-query-devtools10.00% <ø> (ø)
@tanstack/react-query-next-experimental∅ <ø> (∅)
@tanstack/react-query-persist-client100.00% <ø> (ø)
@tanstack/solid-query78.20% <ø> (ø)
@tanstack/solid-query-devtools∅ <ø> (∅)
@tanstack/solid-query-persist-client100.00% <ø> (ø)
@tanstack/svelte-query87.33% <ø> (ø)
@tanstack/svelte-query-devtools∅ <ø> (∅)
@tanstack/svelte-query-persist-client100.00% <ø> (ø)
@tanstack/vue-query71.01% <ø> (ø)
@tanstack/vue-query-devtools∅ <ø> (∅)

Sign up for freeto 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.

2 participants

@joseph0926@TkDodo