Main-thread yielding (scheduler.yield vs requestIdleCallback) and the Core Web Vitals

No yielding API, requestIdleCallback(), scheduler.yield(), isInputPending(), or scheduler.postTask(): how JavaScript-heavy sites break up long tasks and keep Interaction to Next Paint (INP) fast.

Field data PhoneDesktopAll Scope All sites October 2026 edition · All devices field outcomes

More than two in three sites (68.3%) call no main-thread yielding API. 26.8% use requestIdleCallback() and 4.9% use scheduler.yield(). Across all sites, 95% without a yielding API have a good INP, compared with 95% for scheduler.yield() and 94% for requestIdleCallback(). Sites without a yielding API load a median of 20 scripts, while scheduler.yield() sites load 77 scripts. Even with that workload, scheduler.yield() holds median Total Blocking Time to 33 ms, against 91 ms for requestIdleCallback().

The State of Web Vitals · October 2026 · 210,902 crawled sites · 196,263 with all devices field data · 206,118 sites with main-thread yieldingBy Arjen Karel · corewebvitals.io/state-of-cwv
1

INP pass rate

Sites with no yielding API have a good INP most often at 95%, followed by scheduler.yield() at 95% and requestIdleCallback() at 94%. Both isInputPending() and scheduler.postTask() appear on fewer than 50 sites across the dataset. Pages with little JavaScript do not need a yielding helper, so the raw pass rates mostly reflect how much script each page loads.

SitesGood, needs improvement, poor INPMedian
All sites196,26395%87ms
No yielding API (none) 68.3%132,88495%85ms
scheduler.yield() 4.9%9,63995%82ms
requestIdleCallback() 26.8%53,49794%93ms
navigator.scheduling.isInputPending() <0.1%5680%113ms
scheduler.postTask() <0.1%5171%145ms
GoodNeeds improvementPoorSites: with Chrome field data
The State of Web Vitals · October 2026 · 210,902 crawled sites · 196,263 with all devices field data · 206,118 sites with main-thread yieldingBy Arjen Karel · corewebvitals.io/state-of-cwv
2

Main-thread yielding usage

31.7% of sites call a main-thread yielding API, while 68.3% run scripts without one. Among the sites that yield, 27% (55,193 sites) use requestIdleCallback() and 5% (10,081 sites) use scheduler.yield().

No yielding API (none) 68.3% requestIdleCallback() 26.8%
No yielding API (none) 68.3% requestIdleCallback() 26.8% scheduler.yield() 4.9% navigator.scheduling.isInputPending() <0.1% scheduler.postTask() <0.1%
The State of Web Vitals · October 2026 · 210,902 crawled sites · 196,263 with all devices field data · 206,118 sites with main-thread yieldingBy Arjen Karel · corewebvitals.io/state-of-cwv
3

JavaScript workload by yielding strategy

Yielding APIs appear on pages with heavy JavaScript bundles. Sites with no yielding API load a median of 20 scripts and spend 324 ms in CPU scripting (7 ms Total Blocking Time). Sites using requestIdleCallback() load 44 scripts and spend 1007 ms in scripting, which pushes median Total Blocking Time to 91 ms. Sites using scheduler.yield() load a median of 77 scripts (662 ms scripting). Breaking up those tasks keeps median Total Blocking Time at 33 ms, and 95% have a good INP.

Strategy Median scripts on page Median CPU scripting time Median Total Blocking Time Pass rate
scheduler.yield() 10,081 77 scripts 662 ms 33 ms 95%
requestIdleCallback() 55,193 44 scripts 1,007 ms 91 ms 94%
No yielding API (none) 140,734 20 scripts 324 ms 7 ms 95%
The State of Web Vitals · October 2026 · 210,902 crawled sites · 196,263 with all devices field data · 206,118 sites with main-thread yieldingBy Arjen Karel · corewebvitals.io/state-of-cwv
4

INP pass rate by total script count

Six in ten scheduler.yield() sites load 66 or more scripts. On those heavy pages, 96% of scheduler.yield() sites have a good INP with a 36 ms median Total Blocking Time. Sites on requestIdleCallback() drop to 93% (216 ms TBT), and sites without yielding sit at 97% (204 ms TBT).

Scripts on page scheduler.yield() requestIdleCallback() No yielding API
1 to 15 scripts
89% 0 ms TBT 648 sites
92% 24 ms TBT 6,528 sites
93% 0 ms TBT 50,755 sites
16 to 35 scripts
94% 14 ms TBT 1,512 sites
95% 51 ms TBT 15,278 sites
97% 10 ms TBT 46,674 sites
36 to 65 scripts
92% 70 ms TBT 1,131 sites
95% 95 ms TBT 17,488 sites
97% 75 ms TBT 25,631 sites
66 or more scripts
96% 36 ms TBT 6,787 sites
93% 216 ms TBT 15,857 sites
97% 204 ms TBT 8,595 sites
The State of Web Vitals · October 2026 · 210,902 crawled sites · 196,263 with all devices field data · 206,118 sites with main-thread yieldingBy Arjen Karel · corewebvitals.io/state-of-cwv
5

Understanding main-thread yielding

Why scheduler.yield() resumes faster than setTimeout or requestIdleCallback()

When a script yields with setTimeout(fn, 0) or requestIdleCallback(), the remaining work goes to the back of the task queue. Any queued timer, third-party tracker, or network callback runs before your function continues. scheduler.yield() pauses the current task so the browser can handle input and paint the next frame, then resumes your code ahead of regular tasks. On script-heavy sites (77 median scripts), that holds median Total Blocking Time to 33 ms, against 91 ms on sites using requestIdleCallback().

Break up long JavaScript tasks (over 50 ms) with await scheduler.yield(), and fall back to setTimeout(resolve, 0) in browsers that do not support it yet. Keep requestIdleCallback() for background work like analytics batching, never inside an interaction handler. Across this dataset, sites with no yielding API score 95% good INP because they only load a median of 20 scripts (7 ms Total Blocking Time). Sites using scheduler.yield() load a median of 77 scripts. On pages with 66 or more scripts, scheduler.yield() reaches 96% good INP and 36 ms TBT, ahead of requestIdleCallback() at 93% good INP (216 ms TBT) and 204 ms TBT without yielding.

The State of Web Vitals · October 2026 · 210,902 crawled sites · 196,263 with all devices field data · 206,118 sites with main-thread yieldingBy Arjen Karel · corewebvitals.io/state-of-cwv
Platform & Framework Takeaways

How main-thread yielding plays out per platform

What the field data shows when you isolate a single CMS or framework.

WordPress 65,505 sites
65.3% run scripts with no yielding API

65.3% of WordPress sites call no main-thread yielding API.

Across WordPress, 65.3% of sites run scripts without a yielding API, 32.1% call requestIdleCallback(), and 2.6% call scheduler.yield().

Read the WordPress yielding breakdown →
React & Next.js 9,570 sites
97% vs 91% good INP (scheduler.yield vs requestIdleCallback)

React sites using scheduler.yield() pass INP 6 points more often than sites using requestIdleCallback().

Across React sites, 62.8% call scheduler.yield() (97% good INP, 74ms median) compared with 22.8% calling requestIdleCallback() (91% good INP, 96ms median).

Shopify 8,573 stores
95.5% call requestIdleCallback()

95% of Shopify stores call requestIdleCallback().

Across Shopify storefronts, 95.5% call requestIdleCallback() (97ms median INP, 96% good INP overall) and 4.2% call scheduler.yield().

Wix 5,825 sites
99.9% use scheduler.yield() (73ms median INP)

100% of Wix sites call scheduler.yield().

Across Wix sites, 99.9% call scheduler.yield() (97% good INP, 73ms median).

Related signals Scheduling API use → CSS hints → Interaction invoker types → Blocking frame breakdown → By Arjen Karel · 210,902 crawled sites (196,263 with all devices Chrome field data, 206,118 sites with main-thread yielding, October 2026) · How we measured