Skip to content

PAM Native 1.24.0

Choose a tag to compare

@DavidWilliamBalbino DavidWilliamBalbino released this 07 Oct 03:28
· 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=0 keeps 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 function imports) and
    generated expressions read the missing-value sentinel directly (component
    cache format 6: caches are rebuilt once).
  • Element exposes 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.