6d0ec7bf
wire: decode wins — utf8.len validator + fast paths + FFI cast
Five focused decode optimizations, all in wire.lua, landing a 3.9-6.6x speedup on bench/bench.lua decode and matching wins on lazy / shapes benches. Per-helper numbers from bench/wire_bench.lua: is_valid_utf8(32B ASCII): 545 ns -> 36 ns (15x) is_valid_utf8(1KB ASCII): 16329 ns -> 539 ns (30x) decode_string(32B): 140 ns -> 80 ns (1.75x) decode_double: 299 ns -> 226 ns (1.32x) decode_fixed64: 196 ns -> 184 ns (1.07x) 1. utf8.len swap. Pure-Lua RFC 3629 validator replaced by `utf8.len(s) ~= nil` (ICU U8_NEXT-backed at src/lua/utf8.c:165). Source-verified to reject every proto3 case: stray continuation, overlong, surrogates, truncated, > U+10FFFF, 5-byte+ sequences. Conformance suite still at 1478/1478 expected passes. 2. decode_string / decode_bytes 1-byte LEN fast path. Strings <=127 bytes (the RPC common case) skip two function-call layers (decode_string -> decode_len -> decode_varint). 3. decode_float / decode_double via ffi.cast(uint8_t*, buf) instead of buf:sub. Eliminates the per-call string-slice allocation. 4. decode_double Inf/NaN check via a uint32[2] union split. Bit ops on Lua numbers don't allocate; the previous uint64 cdata path produced 3+ intermediates per call. 5. decode_fixed64 reads via the new pb_u64_u_t union (ffi.copy + read .u). Replaces UINT64(lo) + bit.lshift(UINT64(hi), 32) which allocated 2-3 cdata per call. All FFI cdef/union locals hoisted to the top of the file so the fixed-width decoders all reference the same scratch buffers. 497/497 luatest pass. 19/19 jit-trace gates pass. Conformance (binary + text) shows zero unexpected failures.
Eugene Blikh <bigbes@gmail.com> — 2026-05-16 14:43:24 UTC
Commit 6d0ec7bf3b4e1a051bc75efee59c9cd3d5ed3f04 —
view raw patch
Parent(s):
e53089dd
| File | Status | + | − |
|---|---|---|---|
runtime/pb/wire.lua
|
M | +79 | -69 |