Longbridge's gpui-fast Fork Cuts Rust UI Frame Costs by 73%
Longbridge released gpui-fast , a standalone fork of Zed's GPUI framework with a reworked layout engine. A 2500-label grid frame drops from 8.27 ms to 3.71 ms when static, 5.44 ms when fully changing on M4. Head-inserting into an 800-row keyed list goes from 33.95 ms to 9.98 ms per frame.

Takeaways
- Longbridge released gpui-fast , a standalone fork of Zed's GPUI framework with a reworked layout engine.
- A 2500-label grid frame drops from 8.27 ms to 3.71 ms when static, 5.44 ms when fully changing on M4.
- Head-inserting into an 800-row keyed list goes from 33.95 ms to 9.98 ms per frame.
- Core change: Taffy layout nodes and shaped text are retained across frames instead of rebuilt.
- New
.key(id)API gives any element or component sibling-level identity without adding a layout box. - Public API unchanged, Apache-2.0, works as a drop-in replacement for upstream GPUI .
Longbridge has released gpui-fast , a fork of the GPUI framework extracted from the Zed monorepo. The fork retains unchanged layout, text, and paint work across frames. Longbridge kept GPUI’s existing public API intact and added optional APIs, so applications can repoint their dependency to the fork without changing application source.
GPUI is the GPU-accelerated Rust UI framework that powers Zed. Upstream GPUI rebuilt its layout tree at the end of each frame, preventing Taffy from preserving its per-node layout cache. gpui-fast keeps that tree alive and recalculates only nodes whose inputs changed, reducing main-thread work in CPU-bound interfaces.
Real windows, lower frame costs
Longbridge reports median main-thread frame costs from five runs on an Apple M4. The tests render and update real application windows instead of isolated layout operations.
| Workload | GPUI | gpui-fast | Reduction |
|---|---|---|---|
| 2,500 live labels, unchanged | 8.27 ms | 3.71 ms | 55.1% |
| 2,500 live labels, every cell updated | 8.27 ms | 5.44 ms | 34.2% |
| Wide table, continuous scrolling | 7.82 ms | 4.29 ms | 45.1% |
| Insert before 200 keyed rows | 7.43 ms | 1.97 ms | 73.5% |
| Insert before 800 keyed rows | 33.95 ms | 9.98 ms | 70.6% |
The insertion results depend on rows carrying stable data IDs. Rows keyed by their loop index lose their identity when a new item shifts every index, forcing the engine to rebuild them.
Reporting is indexed from AlphaSignal. Rights remain with the original publisher and cited sources.
Read original report

