mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-09-14 18:01:58 +00:00
This makes the `ghostty_render_state_*` C API significantly faster on wasm32-freestanding, measured in V8 via Node for Chrome. Also verified in `jsc` for Safari. The major change is a new bulk row read API that makes full-screen cell reads roughly 10x faster for wasm embedders. This should help any embedder with high FFI overhead, such as Go, Python, etc. too. Non-wasm performance is not impacted, all benchmarks were run on my mac too w/ no regressions (two of the changes are native wins as well). ## Changes * color: the "vectorized" palette conversion loop was silently scalarized by LLVM into per-byte ops because it loaded/stored through array-typed pointers. Zig 0.16 disables the LLVM loop vectorizer, so manually vectorized loops must go through vector-typed pointers. * C styles: major optimizations to converting Zig styles to C styles. This is a heavy operation for render state. * render: `endUpdate`'s style-run fill (`@memset` with a struct value) re-loaded its source every iteration and stored field by field. Now manually vectorized. * render: new `GHOSTTY_RENDER_STATE_ROW_DATA_CELLS_RAW` returns a borrowed `GhosttyCellsView` of the current row's raw cell values, valid until the next update. One call per row instead of 3-6 calls per cell. ## Benchmarks | Benchmark | Before | After | Speedup | |---|---|---|---| | colors_get | 114 ns | 35 ns | 3.3x | | style get, per styled cell | 7.8 ns | 6.7 ns | 1.2x | | raw+style read, per cell | 8.6 ns | 7.7 ns | 1.1x | | full-screen text read, per cell | 7.5 ns | 0.7 ns | 10.7x | | full-screen text+style read, per cell | 8.6 ns | 1.7 ns | 5.1x | | render state update, styled full frame | 3.4 us | 2.6 us | 1.3x | **AI usage:** Fable did the implementation and benchmarking and drafted this message. Comments were partially rewritten by me.