Repository navigation
PAM Native 1.24.0
·
19 commits
to main
since this release
PAM Native 1.24.0
Source commit: a3285bb99224c0b31af5490cc9602edbc1a3e098 ([skip ci]).
- Faster render pipeline, same frames: on the Zé Chat host benchmark suite
(16 screens, nine interleaved processes per screen against 1.22.7/1.23.1,
whose render path is identical) the summed per-screen medians fall 34%
(570.8 to 375.5 ms) and the p90 across processes 38% (625.2 to 387.1 ms);
per operation, the median falls 30% (1.80 to 1.26 ms). Every encoded frame
of every benchmark is byte-identical to 1.22.7, and render counts and
lifecycle hook counts are unchanged. - Encoder: a subtree the previous frame already emitted is diffed in O(1)
(only its root placement can change), so patches cost what changed instead
of the tree size; constant element properties are encoded once per
template element; long strings (inline images) are validated and copied
once within a byte budget; node ids come from the binary digest. - Renderer: compiled component call sites whose evaluated inputs did not
change skip prop diffing, configuration, contract validation and
decoration; native elements dispatch straight to the fast path from cached
style entries (also with dynamic classes, alternating classes and
environment-dependent styles, now cached per window/container/style
environment); text-only children interpolate without child render data;
method event handlers are built once per scope; render data is handed to
children without copies. - Runtime: component bookkeeping is updated in place (no quadratic copies
for long lists); reused subtrees are retained from a cached state list;
commit visits only components that need attach, resume or effects;
discarded components and trees are freed without the cycle collector
(released render references, weak state callbacks, no recursive closures).
PHP's cycle collector runs between frames once 40,000 roots are buffered
(PAM_NATIVE_FRAME_GC=0keeps PHP's own scheduling, a number sets the
budget) and at shutdown. The first runtime checkpoint is written after the
runtime stays up for five seconds instead of in the first frame. - Hot paths compile to dedicated opcodes (
use functionimports) and
generated expressions read the missing-value sentinel directly (component
cache format 6: caches are rebuilt once). Elementexposes its encoding fields as read-only public properties
(kind,properties,events,children,elementKey,domIdentity,
identitySlot,reusable);TreeEncoder::frameNodes()returns the last
frame's nodes. No protocol identifiers, wire format, Android or iOS code
changed. See migration notes.
Completed validation
- Byte-identical frames: every encoded frame of the 16 Zé Chat host
benchmarks (inbox, chat, feed, reels, stories, create, chat-details, profile,
notifications, activity, calls, search, contacts, comments, social-list,
forward) matches 1.22.7 byte for byte; render counts and mount, attach,
resume, unmount and forget counts are unchanged on every benchmark. - New differential encoder test: 400 frames whose patches, applied to the
previous tree, must equal a fresh full frame (reused, moved, dropped and
nested subtrees); environment-dependent styles re-resolve after density
changes. - PHP SDK suite, performance, visual DOM, navigation and fuzz scripts,
release-workflow and hot-reload contracts, phpstan (singularity config),
protocol parity, 552 PHP parses, Rust formatting, 207 Rust workspace tests
and 216 JVM tests passed. Android and iOS code are unchanged. - All 12 release assets have verified hashes; renderer, PHP SDK and AAR
reproducibility and package budgets were verified.