Deep tree frame (5.1k nodes)
Dirty frame, large-tree benchmark
Every number on this page comes from the published npm packages running identical workloads in fresh processes — no workspace shortcuts, no estimates.
Overview
Measured results, including where OpenTUI wins. Green badges mark BetterTUI ahead; grey badges mark OpenTUI ahead.
Dirty frame, large-tree benchmark
Average across large workloads
Average module load, fresh process
OpenTUI cannot construct the 20k and 50k apps (native cap 16,382)
Hello World / Counter / Dashboard average
Installed package size incl. native binaries
Visual Comparison
Mean time to apply a bulk update and render a complete frame (logarithmic scale). Shorter bars are better.
Log scale — each major grid division is a 10× step in frame time. Bars are not proportional to absolute difference.
Detailed Results
Each app runs an identical workload in both frameworks. Frame = bulk update + render; update = single-node change + render; RSS = memory after the workload. The verdict column names the faster framework on frame time.
| Benchmark | Scale | OpenTUI Frame | BetterTUI Frame | OpenTUI Update | BetterTUI Update | FPS OT/BT | RSS OT/BT | Verdict |
|---|---|---|---|---|---|---|---|---|
Hello World Single text node | — | 27µs | 34µs | 19µs | 32µs | 40472 / 25197 | 92 / 116MB | OpenTUI 26% |
Counter State + re-render on key | — | 21µs | 38µs | 21µs | 35µs | 37354 / 23383 | 100 / 128MB | OpenTUI 81% |
Large List 10k text rows in one column | 10,000 | 13ms | 21ms | 13ms | 21ms | 79 / 48 | 335 / 133MB | OpenTUI 66% |
Large Table 1k rows x 20 columns of text cells | 20,000 | cannot build | 67ms | — | 76ms | — | — | OpenTUI limit |
Large Tree 5.1k nodes: 8-level binary box tree with text leaves | 5,119 | 97ms | 33ms | 10ms | 33ms | 10 / 31 | 284 / 91MB | BetterTUI 66% |
Dashboard Mixed bordered panels, stats, input | — | 224µs | 270µs | 51µs | 246µs | 5382 / 3314 | 106 / 135MB | OpenTUI 21% |
Markdown Viewer 600 lines of styled text | — | 986µs | 1.09ms | 509µs | 1.10ms | 1045 / 911 | 109 / 104MB | OpenTUI 11% |
Animation Text + box size changes every frame | — | 39µs | 43µs | 39µs | 54µs | 24497 / 9903 | 100 / 147MB | OpenTUI 10% |
Terminal Scroll 2k rows viewport scroll stress | 2,000 | 237µs | 6.83ms | 212µs | 6.82ms | 4954 / 149 | 157 / 116MB | OpenTUI 2780% |
Stress Test 50k text nodes | 50,000 | cannot build | 165ms | — | 166ms | — | — | OpenTUI limit |
Single text node
State + re-render on key
10k text rows in one column
1k rows x 20 columns of text cells
5.1k nodes: 8-level binary box tree with text leaves
Mixed bordered panels, stats, input
600 lines of styled text
Text + box size changes every frame
2k rows viewport scroll stress
50k text nodes
Measured Pipeline
Every stage below is measured on the dashboard app — import and startup from a fresh process, then per-frame costs from timed render passes. No stage is estimated.
Module load, fresh process
Renderer + mount + first frame
Real input pipeline to update
One node change + render
All stats mutated + render
Render with no changes
Interactive
Pick a metric and a benchmark app to see how BetterTUI compares to OpenTUI in real time.
Selected metric
Time to apply a bulk update and render the resulting frame.
Shorter bars are better.
Click the menu to compare another benchmark workload.
BetterTUI: 66% lower
BetterTUI records 32.67ms compared with 96.83ms.
Values are medians across sampled frames and repeated fresh processes.
Methodology
Both frameworks are installed from the public npm registry — no workspace links — and measured in the same headless terminal on the same machine.
Protocol
Each framework×app pair runs in its own fresh process. After 20 warmup frames, sample counts adapt to the measured frame cost (slow apps get fewer samples, capped by a per-phase time budget). Input latency drives each framework’s real input pipeline through mock key events; FPS, smoothness, and CPU come from a sustained burst of back-to-back dirty frames. Memory is read after a forced GC. Everything is timed with performance.now() around each framework’s own test-renderer step.