Skip to content

perf: omit dev fields from production jsx vnodes - #5220

Open
JoviDeCroock wants to merge 1 commit into
mainfrom
JoviDeCroock/jsx-runtime-vnode-shape
Open

perf: omit dev fields from production jsx vnodes#5220
JoviDeCroock wants to merge 1 commit into
mainfrom
JoviDeCroock/jsx-runtime-vnode-shape

Conversation

@JoviDeCroock

@JoviDeCroock JoviDeCroock commented Aug 29, 2026

Copy link
Copy Markdown
Member

Production jsx and jsxs vnodes no longer reserve __source and __self; development calls still attach metadata before the vnode hook runs.

This reduces retained heap by 8 bytes per production vnode in Chromium, with a 6.1% creation-time improvement. Note that the normal benchmarks do not jsx so the GH summary won't contain the perf benefit.

@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown

📊 Tachometer Benchmark Results

Summary

duration

  • create10k: unsure 🔍 -1% - +1% (-6.91ms - +6.39ms)
    preact-local vs preact-main
  • filter-list: unsure 🔍 -1% - +0% (-0.10ms - +0.04ms)
    preact-local vs preact-main
  • hydrate1k: unsure 🔍 -2% - +1% (-1.10ms - +0.53ms)
    preact-local vs preact-main
  • many-updates: unsure 🔍 -4% - +3% (-0.61ms - +0.52ms)
    preact-local vs preact-main
  • replace1k: unsure 🔍 -3% - +1% (-1.62ms - +0.65ms)
    preact-local vs preact-main
  • text-update: unsure 🔍 -2% - +7% (-0.04ms - +0.13ms)
    preact-local vs preact-main
  • todo: faster ✔ 0% - 4% (0.04ms - 1.42ms)
    preact-local vs preact-main
  • update10th1k: unsure 🔍 -4% - +4% (-1.41ms - +1.26ms)
    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 🔍 -0% - +5% (-0.02ms - +0.23ms)
    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.01ms)
    preact-local vs preact-main
  • text-update: unsure 🔍 -3% - +3% (-0.03ms - +0.03ms)
    preact-local vs preact-main
  • todo: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • update10th1k: unsure 🔍 -0% - +0% (-0.01ms - +0.01ms)
    preact-local vs preact-main

Results

create10k

duration

VersionAvg timevs preact-localvs preact-main
preact-local826.81ms - 837.07ms-unsure 🔍
-1% - +1%
-6.91ms - +6.39ms
preact-main827.97ms - 836.43msunsure 🔍
-1% - +1%
-6.39ms - +6.91ms
-

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.48ms - 16.61ms-unsure 🔍
-1% - +0%
-0.10ms - +0.04ms
preact-main16.56ms - 16.60msunsure 🔍
-0% - +1%
-0.04ms - +0.10ms
-

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-local54.02ms - 55.24ms-unsure 🔍
-2% - +1%
-1.10ms - +0.53ms
preact-main54.38ms - 55.46msunsure 🔍
-1% - +2%
-0.53ms - +1.10ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local5.04ms - 5.26ms-unsure 🔍
-0% - +5%
-0.02ms - +0.23ms
preact-main4.99ms - 5.10msunsure 🔍
-4% - +0%
-0.23ms - +0.02ms
-
many-updates

duration

VersionAvg timevs preact-localvs preact-main
preact-local16.15ms - 17.00ms-unsure 🔍
-4% - +3%
-0.61ms - +0.52ms
preact-main16.25ms - 16.99msunsure 🔍
-3% - +4%
-0.52ms - +0.61ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local3.76ms - 3.76ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main3.76ms - 3.76msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-
replace1k
  • Browser: chrome-headless
  • Sample size: 110
  • Built by: CI #5869
  • Commit: 211afcf

duration

VersionAvg timevs preact-localvs preact-main
preact-local49.04ms - 50.57ms-unsure 🔍
-3% - +1%
-1.62ms - +0.65ms
preact-main49.45ms - 51.13msunsure 🔍
-1% - +3%
-0.65ms - +1.62ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local3.05ms - 3.06ms-unsure 🔍
-0% - +0%
-0.01ms - +0.01ms
preact-main3.04ms - 3.06msunsure 🔍
-0% - +0%
-0.01ms - +0.01ms
-

run-warmup-0

VersionAvg timevs preact-localvs preact-main
preact-local21.38ms - 22.07ms-unsure 🔍
-2% - +2%
-0.43ms - +0.54ms
preact-main21.33ms - 22.00msunsure 🔍
-2% - +2%
-0.54ms - +0.43ms
-

run-warmup-1

VersionAvg timevs preact-localvs preact-main
preact-local26.30ms - 27.11ms-unsure 🔍
-3% - +2%
-0.69ms - +0.49ms
preact-main26.38ms - 27.24msunsure 🔍
-2% - +3%
-0.49ms - +0.69ms
-

run-warmup-2

VersionAvg timevs preact-localvs preact-main
preact-local25.73ms - 26.73ms-unsure 🔍
-5% - +0%
-1.31ms - +0.11ms
preact-main26.34ms - 27.34msunsure 🔍
-0% - +5%
-0.11ms - +1.31ms
-

run-warmup-3

VersionAvg timevs preact-localvs preact-main
preact-local21.60ms - 21.97ms-unsure 🔍
-1% - +1%
-0.23ms - +0.28ms
preact-main21.59ms - 21.94msunsure 🔍
-1% - +1%
-0.28ms - +0.23ms
-

run-warmup-4

VersionAvg timevs preact-localvs preact-main
preact-local21.33ms - 22.10ms-faster ✔
1% - 6%
0.16ms - 1.25ms
preact-main22.03ms - 22.81msslower ❌
1% - 6%
0.16ms - 1.25ms
-

run-final

VersionAvg timevs preact-localvs preact-main
preact-local18.16ms - 18.48ms-unsure 🔍
-2% - +1%
-0.36ms - +0.18ms
preact-main18.20ms - 18.63msunsure 🔍
-1% - +2%
-0.18ms - +0.36ms
-
text-update
  • Browser: chrome-headless
  • Sample size: 220
  • Built by: CI #5869
  • Commit: 211afcf

duration

VersionAvg timevs preact-localvs preact-main
preact-local1.83ms - 1.97ms-unsure 🔍
-2% - +7%
-0.04ms - +0.13ms
preact-main1.81ms - 1.91msunsure 🔍
-7% - +2%
-0.13ms - +0.04ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.04ms - 1.08ms-unsure 🔍
-3% - +3%
-0.03ms - +0.03ms
preact-main1.04ms - 1.08msunsure 🔍
-3% - +3%
-0.03ms - +0.03ms
-
todo

duration

VersionAvg timevs preact-localvs preact-main
preact-local32.02ms - 32.25ms-faster ✔
0% - 4%
0.04ms - 1.42ms
preact-main32.18ms - 33.54msslower ❌
0% - 4%
0.04ms - 1.42ms
-

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

duration

VersionAvg timevs preact-localvs preact-main
preact-local31.68ms - 33.57ms-unsure 🔍
-4% - +4%
-1.41ms - +1.26ms
preact-main31.75ms - 33.65msunsure 🔍
-4% - +4%
-1.26ms - +1.41ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local2.97ms - 2.99ms-unsure 🔍
-0% - +0%
-0.01ms - +0.01ms
preact-main2.98ms - 2.99msunsure 🔍
-0% - +0%
-0.01ms - +0.01ms
-

tachometer-reporter-action v2 for CI

@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown

Size Change: +12 B (+0.08%)

Total Size: 15.8 kB

📦 View Changed
Filename Size Change
jsx-runtime/dist/jsxRuntime.mjs 868 B +12 B (+1.4%)
ℹ️ 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
hooks/dist/hooks.mjs 1.55 kB
test-utils/dist/testUtils.mjs 473 B

compressed-size-action

@coveralls

coveralls commented Aug 29, 2026

Copy link
Copy Markdown

Coverage Status

coverage: 99.533%. remained the same — JoviDeCroock/jsx-runtime-vnode-shape into main

@JoviDeCroock
JoviDeCroock force-pushed the JoviDeCroock/jsx-runtime-vnode-shape branch from 2606820 to 211afcf Compare August 29, 2026 07:18
@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