Skip to content

Performance

How Otty stays fast, what to measure, and what to tune.

Render pipeline

  • macOS: native Metal renderer, one GPU layer per pane.
  • Windows (planned): native DirectX 12 renderer.
  • Subpixel-aware glyph caching, so a repeated glyph is rendered once and reused.
  • Inactive tabs can release their renderer resources entirely — see freeze-inactive-tab below.

Memory

  • Sparse-row grid storage — only cells that have ever been written are allocated. Empty scrollback rows are free.
  • Scrollback capped per pane:
scrollback-rows = 10000        # default
  • Inline images use a small atlas with eviction; very large or rare images bypass.

Benchmarks

Throughput measured with vtebench — each test streams a fixed ~1 MiB of escape sequences and records how long the terminal takes to parse and render it. Lower is faster, and each row's fastest result is bold.

Take these numbers with a grain of salt

This is a sample benchmark to show Otty is fast enough — not a claim that Otty is definitively faster than Ghostty.

  • It was run on my personal MacBook with other apps open in the background. This is not a controlled test environment.
  • The absolute results don't mean much. The first debug build of Otty I ran this on was ~100× slower than Ghostty, yet I never felt any lag using Otty for real work.
  • The benchmark is very different from real usage. The unicode test, for instance, hammers the terminal with Chinese characters I can't even read — you'll never see that density of CJK in one screen during actual work.
  • A terminal can also look fast here because it has bugs or hasn't implemented a feature yet. Fewer things to do is not the same as doing them better.

Treat this as a rough sanity check, not a leaderboard.

Test environment

  • Machine — MacBook Pro, Apple M5 Max (18-core), 64 GB RAM
  • OS — macOS 26.5.1 (build 25F80)
  • Terminals — Otty 1.0.2 · Ghostty 1.3.1 · Terminal.app 2.15 (470.2)
  • Date — 2026-06-11
  • Release builds, identical window size, run back-to-back in one sitting.

Warm (steady state)

Caches and glyph atlas warmed up — representative of day-to-day use.

BenchmarkOttyGhosttyTerminal.app
dense_cells7.2 ms23.6 ms24.4 ms
medium_cells22.8 ms24.8 ms34.9 ms
sync_medium_cells23.0 ms29.5 ms38.9 ms
unicode23.1 ms23.3 ms27.3 ms
scrolling21.1 ms39.3 ms140.2 ms
scrolling_fullscreen21.0 ms48.3 ms143.6 ms
scrolling_top_region41.0 ms39.6 ms117.3 ms
scrolling_top_small_region19.4 ms39.2 ms117.1 ms
scrolling_bottom_region19.7 ms39.1 ms116.3 ms
scrolling_bottom_small_region19.8 ms39.1 ms116.5 ms

At steady state Otty is fastest on 9 of 10 tests — about faster than both rivals on dense_cells, and 2–6× faster on scrolling, where Terminal.app falls to ~120–140 ms while Otty holds ~20 ms. Otty and Ghostty are within a millisecond on unicode and scrolling_top_region (the one test Ghostty edges out).

Cold start (first run)

First pass right after launch, before any caches warm up.

BenchmarkOttyGhosttyTerminal.app
dense_cells23.8 ms62.3 ms70.1 ms
medium_cells32.8 ms64.8 ms67.9 ms
sync_medium_cells32.4 ms55.2 ms60.9 ms
unicode30.0 ms57.7 ms51.3 ms
scrolling53.7 ms130.5 ms168.2 ms
scrolling_fullscreen56.7 ms147.7 ms178.9 ms
scrolling_top_region68.3 ms136.3 ms159.2 ms
scrolling_top_small_region42.6 ms127.3 ms150.8 ms
scrolling_bottom_region41.7 ms125.4 ms153.2 ms
scrolling_bottom_small_region41.9 ms126.4 ms155.6 ms

Reproduce it

bash
git clone https://github.com/alacritty/vtebench
cd vtebench && cargo build --release
# Run inside the terminal you want to measure, then compare:
./target/release/vtebench --bench-path ./benchmarks -o results.txt

Numbers vary by machine, GPU, and font — what matters is running all terminals on the same setup in one sitting.

Profiling and reports

bash
otty config get memory-report

In-app, Window → Memory Report breaks down per-window / per-tab memory, atlas size, and grid allocations.

Crash and performance reports under ~/Library/Application Support/Otty/Crash/.

See also

Otty