# shessh performance measurements — 18 September 2026

These are measurements of the measured build, not a comparison with another SSH client.

## Current short benchmark

Measured at: 2026-09-18T11:17:11.595417+00:00

Machine: Apple M5, 16 GiB RAM, macOS 27.0.

Build: Release benchmark working tree; no sanitizer or leak instrumentation.

Three fresh processes run sequentially. Headline values are medians, with all individual measurements included in the accompanying JSON.

2500 synthetic Unicode, emoji and ANSI lines per session; 2000-row history limit; local PTY; initial window 1180x720 points at 2x. Tabs are visited in sequence; four visible splits follow the eight-tab cycle.

Application process only; excludes child shells and WindowServer. RSS and physical footprint are separate metrics, not additive.

5 MiB ASCII parser/grid/scrollback workload; 100 local PTY key-to-parse samples per run; excludes display and network latency.

Memory snapshots are taken after synthetic output completes. They are not startup-idle, peak-memory, or real remote-SSH measurements. The current benchmark uses the production AppKit, PTY, terminal and Metal implementations.

| Scenario | Footprint median (MiB) | Footprint range (MiB) | RSS median (MiB) | RSS range (MiB) |
|---|---:|---:|---:|---:|
| empty-window | 33.52 | 33.22–33.78 | 102.69 | 102.44–102.73 |
| one-tab-full-history | 127.31 | 117.45–127.59 | 124.48 | 124.20–124.53 |
| four-tabs-full-history | 262.20 | 252.50–262.59 | 153.67 | 153.36–153.78 |
| eight-tabs-full-history | 443.99 | 434.17–444.25 | 194.27 | 194.02–194.36 |
| after-closing-eight-tabs | 116.84 | 116.67–117.17 | 192.88 | 192.67–192.88 |
| four-visible-split-panes | 209.49 | 206.61–212.78 | 205.77 | 205.27–206.67 |
| after-closing-splits | 122.91 | 122.70–123.30 | 198.75 | 198.66–199.38 |
| four-tabs-second-cycle | 314.74 | 314.47–318.00 | 207.19 | 206.91–207.52 |
| after-second-cleanup | 123.05 | 122.92–123.56 | 199.09 | 193.95–199.64 |
| app-after-autorelease-drain | 122.31 | 122.14–122.81 | 199.55 | 194.36–200.08 |

| Speed measurement | Median | Range |
|---|---:|---:|
| ASCII parser/grid/scrollback | 22.000 MiB/s | 22.000–23.700 MiB/s |
| Local PTY per-run p50 | 0.129 ms | 0.128–0.129 ms |
| Local PTY per-run p95 | 0.134 ms | 0.133–0.144 ms |
| 132×40 viewport capture/release | 0.015 ms | 0.015–0.015 ms |

PTY percentiles use 100 samples per run. The headline p95 is the median of the three p95 values, not a pooled 300-sample percentile. It excludes display and network latency.

One machine, short synthetic runs; desktop load and system caches are not tightly controlled. These results do not establish comparative performance or long-term memory stability.

All three native runs logged a PTY SIGHUP warning during teardown and exited successfully. Cached memory remained after closing terminals; no leak check was performed as part of these new measurements.

Source fingerprint (SHA-256): `26637def2d9053e13d99392eea1ef30927df656a2e8abe0552b00b71230ad27c`.
This identifies the measured working tree: sorted .c/.h/.m/.metal files in app/, core/, renderer/, platform/, hashing each relative path, a NUL byte, and file contents. It is not a release artifact hash.

## Historical sustained-output test

Two 600-second runs with 120-second warmup, one sample per second, about 500 Unicode/emoji/CJK/ANSI lines per second, one native terminal. Same Apple M5 / 16 GiB / macOS 27.0 machine. App process only; excludes child shells, producer, and WindowServer.

**These runs used an earlier measured build. They do not validate long-term stability of the current short-benchmark build.**

Each run processed 300,050 lines. Scrollback plus the active screen retained 2,031 newlines and the glyph atlas stayed at its 16 MiB limit. GPU submissions continued throughout measured intervals.

| Run | RSS median growth (MiB) | RSS trend (MiB/min) | Footprint median growth (MiB) | Footprint trend (MiB/min) | Result |
|---|---:|---:|---:|---:|---|
| First | 13.60 | 1.70 | -0.75 | -0.31 | FAIL: RSS trend |
| Repeat | 14.72 | -0.94 | 7.30 | 0.18 | PASS |

Preset memory limits, unchanged between runs: median growth ≤16 MiB; linear trend ≤1 MiB/minute; p95–p05 spread ≤64 MiB, for both RSS and footprint. Growth compares the first and last post-warmup minute medians; trend uses linear regression over all post-warmup samples.

Footprint passed both runs. The first run failed the RSS trend limit; the repeat passed all checks. RSS varied rather than remaining flat. This is limited-duration evidence, not a leak-free or indefinitely stable guarantee.

## Reproduction

These measurement summaries are available to download; source-based independent reproduction requires source access. No real VPS data or credentials were used.

With source access on a logged-in macOS desktop:

```sh
make benchmark
make memory-soak
```

For these short-run medians, build the Release terminal_benchmark and ShesshMemoryBenchmark targets and run each three times in fresh processes, sequentially. Use the same hardware, window size, backing scale and workload for comparisons.

Companion file: 2026-09-18.json (all short-run samples, min/median/max summaries, historical soak summaries, machine details, and methodology).
