preact
preact copied to clipboard
Experiment: split component lifecycle merge types
This is an alternative to #3518 that re-unifies component rendering (function and class components taking the same codepath) in order to split apart component mounting vs patching. It may also be possible to keep function/class components split up while also keeping mount/patch separate, but some quick experiments locally seemed to show a fairly major size increase (4 functions with limited similarity, vs 2 similar functions in both main
and this PR).
The code here is primarily a refactoring of the v11 code from main
, with a few optimizations from vm
incorporated. In particular, renderFunctionComponent()
and renderClassComponent()
were merged into a new patchComponent()
method (to match patchElement
). It also removes short-circuiting of Text Internals, since we hadn't actually intended to bypass options._diff()
and options.diffed()
for those.
📊 Tachometer Benchmark Results
Summary
duration
- 02_replace1k: unsure 🔍 -1% - +2% (-2.78ms - +3.33ms)
preact-local vs preact-master - 03_update10th1k_x16: slower ❌ 0% - 5% (0.12ms - 2.35ms)
preact-local vs preact-master - 07_create10k: unsure 🔍 -0% - +0% (-4.92ms - +1.29ms)
preact-local vs preact-master - filter_list: unsure 🔍 -5% - +1% (-52.71ms - +15.93ms)
preact-local vs preact-master - hydrate1k: unsure 🔍 -9% - +5% (-11.94ms - +6.05ms)
preact-local vs preact-master - many_updates: unsure 🔍 -6% - +2% (-49.87ms - +20.87ms)
preact-local vs preact-master - text_update: unsure 🔍 -5% - +10% (-16.34ms - +33.98ms)
preact-local vs preact-master - todo: unsure 🔍 -5% - +0% (-2.77ms - +0.31ms)
preact-local vs preact-master
usedJSHeapSize
- 02_replace1k: slower ❌ 0% - 1% (0.01ms - 0.03ms)
preact-local vs preact-master - 03_update10th1k_x16: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
preact-local vs preact-master - 07_create10k: unsure 🔍 -0% - +0% (-0.03ms - +0.04ms)
preact-local vs preact-master - filter_list: slower ❌ 1% - 1% (0.02ms - 0.03ms)
preact-local vs preact-master - hydrate1k: unsure 🔍 +0% - +0% (+0.00ms - +0.01ms)
preact-local vs preact-master - many_updates: unsure 🔍 -0% - +0% (-0.01ms - +0.01ms)
preact-local vs preact-master - text_update: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
preact-local vs preact-master - todo: unsure 🔍 -1% - +2% (-0.01ms - +0.03ms)
preact-local vs preact-master
Results
02_replace1k
- Browser: chrome-headless 102.0.5005.61
- Sample size: 80
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 186.64ms - 190.97ms | - | unsure 🔍 -2% - +1% -3.33ms - +2.78ms |
preact-local | 186.93ms - 191.23ms | unsure 🔍 -1% - +2% -2.78ms - +3.33ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 4.16ms - 4.17ms | - | faster ✔ 0% - 1% 0.01ms - 0.03ms |
preact-local | 4.17ms - 4.19ms | slower ❌ 0% - 1% 0.01ms - 0.03ms | - |
run-warmup-0
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 61.40ms - 63.43ms | - | faster ✔ 0% - 5% 0.27ms - 3.18ms |
preact-local | 63.09ms - 65.18ms | slower ❌ 0% - 5% 0.27ms - 3.18ms | - |
run-warmup-1
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 85.27ms - 89.20ms | - | slower ❌ 4% - 12% 3.45ms - 9.29ms |
preact-local | 78.71ms - 83.02ms | faster ✔ 4% - 11% 3.45ms - 9.29ms | - |
run-warmup-2
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 78.87ms - 81.51ms | - | unsure 🔍 -4% - +0% -3.55ms - +0.14ms |
preact-local | 80.61ms - 83.18ms | unsure 🔍 -0% - +4% -0.14ms - +3.55ms | - |
run-final
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 186.66ms - 191.00ms | - | unsure 🔍 -2% - +1% -3.34ms - +2.76ms |
preact-local | 186.97ms - 191.27ms | unsure 🔍 -1% - +2% -2.76ms - +3.34ms | - |
03_update10th1k_x16
- Browser: chrome-headless 102.0.5005.61
- Sample size: 60
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 49.49ms - 50.83ms | - | faster ✔ 0% - 5% 0.12ms - 2.35ms |
preact-local | 50.51ms - 52.29ms | slower ❌ 0% - 5% 0.12ms - 2.35ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 4.19ms - 4.20ms | - | unsure 🔍 -0% - +0% -0.00ms - +0.00ms |
preact-local | 4.19ms - 4.19ms | unsure 🔍 -0% - +0% -0.00ms - +0.00ms | - |
07_create10k
- Browser: chrome-headless 102.0.5005.61
- Sample size: 50
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 1267.99ms - 1272.82ms | - | unsure 🔍 -0% - +0% -1.29ms - +4.92ms |
preact-local | 1266.64ms - 1270.54ms | unsure 🔍 -0% - +0% -4.92ms - +1.29ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 28.31ms - 28.36ms | - | unsure 🔍 -0% - +0% -0.04ms - +0.03ms |
preact-local | 28.32ms - 28.36ms | unsure 🔍 -0% - +0% -0.03ms - +0.04ms | - |
filter_list
- Browser: chrome-headless 102.0.5005.61
- Sample size: 60
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 1093.45ms - 1137.21ms | - | unsure 🔍 -1% - +5% -15.93ms - +52.71ms |
preact-local | 1070.49ms - 1123.38ms | unsure 🔍 -5% - +1% -52.71ms - +15.93ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 2.10ms - 2.11ms | - | faster ✔ 1% - 1% 0.02ms - 0.03ms |
preact-local | 2.12ms - 2.14ms | slower ❌ 1% - 1% 0.02ms - 0.03ms | - |
hydrate1k
- Browser: chrome-headless 102.0.5005.61
- Sample size: 80
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 118.86ms - 131.08ms | - | unsure 🔍 -5% - +10% -6.05ms - +11.94ms |
preact-local | 115.42ms - 128.63ms | unsure 🔍 -9% - +5% -11.94ms - +6.05ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 6.92ms - 6.92ms | - | unsure 🔍 -0% - -0% -0.01ms - -0.00ms |
preact-local | 6.92ms - 6.92ms | unsure 🔍 +0% - +0% +0.00ms - +0.01ms | - |
many_updates
- Browser: chrome-headless 102.0.5005.61
- Sample size: 70
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 841.85ms - 893.47ms | - | unsure 🔍 -2% - +6% -20.87ms - +49.87ms |
preact-local | 828.97ms - 877.35ms | unsure 🔍 -6% - +2% -49.87ms - +20.87ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 5.73ms - 5.73ms | - | unsure 🔍 -0% - +0% -0.01ms - +0.01ms |
preact-local | 5.73ms - 5.73ms | unsure 🔍 -0% - +0% -0.01ms - +0.01ms | - |
text_update
- Browser: chrome-headless 102.0.5005.61
- Sample size: 80
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 332.05ms - 366.39ms | - | unsure 🔍 -9% - +4% -33.98ms - +16.34ms |
preact-local | 339.65ms - 376.44ms | unsure 🔍 -5% - +10% -16.34ms - +33.98ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 1.31ms - 1.31ms | - | unsure 🔍 -0% - +0% -0.00ms - +0.00ms |
preact-local | 1.31ms - 1.32ms | unsure 🔍 -0% - +0% -0.00ms - +0.00ms | - |
todo
- Browser: chrome-headless 102.0.5005.61
- Sample size: 60
- Built by: Benchmarks #786
-
Commit: 0d75911
duration
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 58.63ms - 61.12ms | - | unsure 🔍 -1% - +5% -0.31ms - +2.77ms |
preact-local | 57.74ms - 59.55ms | unsure 🔍 -5% - +0% -2.77ms - +0.31ms | - |
usedJSHeapSize
Version | Avg time | vs preact-master | vs preact-local |
---|---|---|---|
preact-master | 1.34ms - 1.37ms | - | unsure 🔍 -2% - +1% -0.03ms - +0.01ms |
preact-local | 1.34ms - 1.38ms | unsure 🔍 -1% - +2% -0.01ms - +0.03ms | - |
Coverage increased (+0.1%) to 99.571% when pulling 0d759117173da24ee5780124477d981b8b18d535 on experiment-split-component-lifecycle-merge-types into 730604ece33bfc0bf5fce31f72f174b764094fc2 on main.
Size Change: -243 B (0%)
Total Size: 38.2 kB
Filename | Size | Change | |
---|---|---|---|
compat/dist/compat.js |
3.62 kB | -9 B (0%) | |
compat/dist/compat.umd.js |
3.7 kB | -10 B (0%) | |
dist/preact.js |
4.61 kB | -86 B (1%) | |
dist/preact.min.js |
4.69 kB | -66 B (1%) | |
dist/preact.umd.js |
4.7 kB | -72 B (1%) |
ℹ️ View Unchanged
Filename | Size | Change | |
---|---|---|---|
debug/dist/debug.js |
3.25 kB | 0 B | |
debug/dist/debug.umd.js |
3.33 kB | 0 B | |
devtools/dist/devtools.js |
232 B | 0 B | |
devtools/dist/devtools.umd.js |
316 B | 0 B | |
hooks/dist/hooks.js |
1.32 kB | 0 B | |
hooks/dist/hooks.umd.js |
1.4 kB | 0 B | |
jsx-runtime/dist/jsxRuntime.js |
342 B | 0 B | |
jsx-runtime/dist/jsxRuntime.umd.js |
425 B | 0 B | |
server/dist/server.js |
2.6 kB | 0 B | |
server/dist/server.umd.js |
2.69 kB | 0 B | |
test-utils/dist/testUtils.js |
431 B | 0 B | |
test-utils/dist/testUtils.umd.js |
516 B | 0 B |