Skip to content

perf(hooks): share state bailout function - #5223

Open
JoviDeCroock wants to merge 2 commits into
mainfrom
JoviDeCroock/hoist-hooks-scu
Open

perf(hooks): share state bailout function#5223
JoviDeCroock wants to merge 2 commits into
mainfrom
JoviDeCroock/hoist-hooks-scu

Conversation

@JoviDeCroock

Copy link
Copy Markdown
Member

Stateful function components now share the hooks shouldComponentUpdate implementation while retaining any prior component bailout.

This removes one closure per component, reducing retained heap by 36 bytes and improving mounts by 5–8% and updates by 0.7–0.8% in Chromium.

@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown

📊 Tachometer Benchmark Results

Summary

duration

  • create10k: unsure 🔍 -1% - +2% (-6.17ms - +16.41ms)
    preact-local vs preact-main
  • filter-list: unsure 🔍 -1% - +1% (-0.19ms - +0.20ms)
    preact-local vs preact-main
  • hydrate1k: unsure 🔍 -2% - +3% (-1.03ms - +1.87ms)
    preact-local vs preact-main
  • many-updates: unsure 🔍 -2% - +4% (-0.32ms - +0.61ms)
    preact-local vs preact-main
  • replace1k: unsure 🔍 -2% - +2% (-1.05ms - +1.30ms)
    preact-local vs preact-main
  • text-update: unsure 🔍 -2% - +7% (-0.04ms - +0.13ms)
    preact-local vs preact-main
  • todo: unsure 🔍 -0% - +3% (-0.09ms - +1.01ms)
    preact-local vs preact-main
  • update10th1k: unsure 🔍 -4% - +1% (-1.26ms - +0.16ms)
    preact-local vs preact-main

usedJSHeapSize

  • create10k: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • filter-list: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • hydrate1k: unsure 🔍 -2% - +5% (-0.11ms - +0.24ms)
    preact-local vs preact-main
  • many-updates: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • replace1k: unsure 🔍 -0% - +0% (-0.01ms - +0.00ms)
    preact-local vs preact-main
  • text-update: unsure 🔍 -3% - +6% (-0.03ms - +0.06ms)
    preact-local vs preact-main
  • todo: unsure 🔍 +0% - +0% (+0.00ms - +0.00ms)
    preact-local vs preact-main
  • update10th1k: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main

Results

create10k

duration

VersionAvg timevs preact-localvs preact-main
preact-local820.89ms - 842.24ms-unsure 🔍
-1% - +2%
-6.17ms - +16.41ms
preact-main822.76ms - 830.11msunsure 🔍
-2% - +1%
-16.41ms - +6.17ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local19.09ms - 19.09ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main19.09ms - 19.09msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-
filter-list

duration

VersionAvg timevs preact-localvs preact-main
preact-local16.45ms - 16.74ms-unsure 🔍
-1% - +1%
-0.19ms - +0.20ms
preact-main16.47ms - 16.72msunsure 🔍
-1% - +1%
-0.20ms - +0.19ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.57ms - 1.57ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main1.57ms - 1.57msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-
hydrate1k

duration

VersionAvg timevs preact-localvs preact-main
preact-local58.05ms - 60.33ms-unsure 🔍
-2% - +3%
-1.03ms - +1.87ms
preact-main57.88ms - 59.67msunsure 🔍
-3% - +2%
-1.87ms - +1.03ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local5.03ms - 5.31ms-unsure 🔍
-2% - +5%
-0.11ms - +0.24ms
preact-main5.00ms - 5.21msunsure 🔍
-5% - +2%
-0.24ms - +0.11ms
-
many-updates

duration

VersionAvg timevs preact-localvs preact-main
preact-local16.37ms - 17.05ms-unsure 🔍
-2% - +4%
-0.32ms - +0.61ms
preact-main16.24ms - 16.88msunsure 🔍
-4% - +2%
-0.61ms - +0.32ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local3.75ms - 3.76ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main3.75ms - 3.76msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-
replace1k
  • Browser: chrome-headless
  • Sample size: 100
  • Built by: CI #5873
  • Commit: 3c54fc4

duration

VersionAvg timevs preact-localvs preact-main
preact-local58.10ms - 59.80ms-unsure 🔍
-2% - +2%
-1.05ms - +1.30ms
preact-main58.01ms - 59.64msunsure 🔍
-2% - +2%
-1.30ms - +1.05ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local3.03ms - 3.04ms-unsure 🔍
-0% - +0%
-0.01ms - +0.00ms
preact-main3.03ms - 3.04msunsure 🔍
-0% - +0%
-0.00ms - +0.01ms
-

run-warmup-0

VersionAvg timevs preact-localvs preact-main
preact-local26.91ms - 27.56ms-unsure 🔍
-1% - +3%
-0.25ms - +0.70ms
preact-main26.66ms - 27.36msunsure 🔍
-3% - +1%
-0.70ms - +0.25ms
-

run-warmup-1

VersionAvg timevs preact-localvs preact-main
preact-local32.62ms - 33.58ms-unsure 🔍
-4% - +1%
-1.29ms - +0.34ms
preact-main32.92ms - 34.23msunsure 🔍
-1% - +4%
-0.34ms - +1.29ms
-

run-warmup-2

VersionAvg timevs preact-localvs preact-main
preact-local32.24ms - 33.64ms-unsure 🔍
-3% - +3%
-1.08ms - +0.84ms
preact-main32.39ms - 33.72msunsure 🔍
-3% - +3%
-0.84ms - +1.08ms
-

run-warmup-3

VersionAvg timevs preact-localvs preact-main
preact-local26.73ms - 27.22ms-unsure 🔍
-2% - +2%
-0.56ms - +0.43ms
preact-main26.62ms - 27.47msunsure 🔍
-2% - +2%
-0.43ms - +0.56ms
-

run-warmup-4

VersionAvg timevs preact-localvs preact-main
preact-local26.64ms - 27.67ms-unsure 🔍
-3% - +3%
-0.94ms - +0.78ms
preact-main26.55ms - 27.93msunsure 🔍
-3% - +3%
-0.78ms - +0.94ms
-

run-final

VersionAvg timevs preact-localvs preact-main
preact-local22.00ms - 22.56ms-unsure 🔍
-1% - +2%
-0.32ms - +0.40ms
preact-main22.02ms - 22.47msunsure 🔍
-2% - +1%
-0.40ms - +0.32ms
-
text-update
  • Browser: chrome-headless
  • Sample size: 220
  • Built by: CI #5873
  • Commit: 3c54fc4

duration

VersionAvg timevs preact-localvs preact-main
preact-local1.91ms - 2.04ms-unsure 🔍
-2% - +7%
-0.04ms - +0.13ms
preact-main1.87ms - 1.98msunsure 🔍
-6% - +2%
-0.13ms - +0.04ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.07ms - 1.14ms-unsure 🔍
-3% - +6%
-0.03ms - +0.06ms
preact-main1.06ms - 1.12msunsure 🔍
-5% - +3%
-0.06ms - +0.03ms
-
todo

duration

VersionAvg timevs preact-localvs preact-main
preact-local32.44ms - 33.46ms-unsure 🔍
-0% - +3%
-0.09ms - +1.01ms
preact-main32.28ms - 32.69msunsure 🔍
-3% - +0%
-1.01ms - +0.09ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.28ms - 1.28ms-unsure 🔍
+0% - +0%
+0.00ms - +0.00ms
preact-main1.28ms - 1.28msunsure 🔍
-0% - -0%
-0.00ms - -0.00ms
-
update10th1k
  • Browser: chrome-headless
  • Sample size: 110
  • Built by: CI #5873
  • Commit: 3c54fc4

duration

VersionAvg timevs preact-localvs preact-main
preact-local28.57ms - 29.50ms-unsure 🔍
-4% - +1%
-1.26ms - +0.16ms
preact-main29.05ms - 30.12msunsure 🔍
-1% - +4%
-0.16ms - +1.26ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local2.97ms - 2.98ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main2.97ms - 2.98msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-

tachometer-reporter-action v2 for CI

@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown

Size Change: +11 B (+0.07%)

Total Size: 15.8 kB

📦 View Changed
Filename Size Change
hooks/dist/hooks.mjs 1.56 kB +11 B (+0.71%)
ℹ️ View Unchanged
Filename Size
compat/dist/compat.mjs 3.9 kB
debug/dist/debug.mjs 3.88 kB
devtools/dist/devtools.mjs 273 B
dist/preact.mjs 4.88 kB
jsx-runtime/dist/jsxRuntime.mjs 856 B
test-utils/dist/testUtils.mjs 473 B

compressed-size-action

@coveralls

coveralls commented Aug 29, 2026

Copy link
Copy Markdown

Coverage Status

coverage: 99.534% (+0.001%) from 99.533% — JoviDeCroock/hoist-hooks-scu into main

@JoviDeCroock

Copy link
Copy Markdown
Member Author

Hesitant whether this is worth it mainly because 12 bytes for a mount-only win

@JoviDeCroock
JoviDeCroock marked this pull request as ready for review September 1, 2026 04:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants