Concrete perf metrics: live counters in --profile + benchmark suite
Live metrics (--profile): - New metricsTracker instruments OnPTYOut, viewport renderer, stdout writes, libghostty-vt Write/Title CGO calls, sidebar / tabbar / status draws (with cache-hit accounting), snapshot replays, and the chrome ticker (so we can see ticker fires that did nothing). - Writes metrics.jsonl (one snapshot per second) and metrics.json + summary.txt on exit, alongside the existing pprof files. - All record* methods are nil-safe so disabled paths pay only a cheap nil check; counters are atomic so the per-PTY-chunk hot path stays lock-free. Benchmark suite (go test -bench=.): - Three workload fixtures — plain ASCII, SGR-styled lines, and a ratatui-style cursor-shuffling burst — plus a containsOSC microbenchmark. Reports ns/op, MB/s, allocs/op, B/op. - Initial baseline numbers added to TODO under the perf-audit section, alongside two new findings (renderer allocs ~1 per 4 bytes on styled chunks; styled throughput tops out near 90 MB/s) those benchmarks surfaced.
This commit is contained in:
27
CHANGELOG.md
27
CHANGELOG.md
@@ -53,12 +53,29 @@ loosely follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
`$XDG_STATE_HOME/patterm/debug/YYYYMMDD-HHMMSS` is used; pass an
|
||||
explicit path to override. All output goes to files — stdout/stderr
|
||||
are untouched.
|
||||
- `--profile[=DIR]` flag captures pprof data for performance work:
|
||||
`cpu.pprof` (running for the lifetime of the session), plus
|
||||
`heap.pprof` and `goroutine.pprof` snapshots written on shutdown.
|
||||
Defaults to `$XDG_STATE_HOME/patterm/profile/YYYYMMDD-HHMMSS`.
|
||||
All diagnostics (startup, errors) are written to `profile.log`
|
||||
- `--profile[=DIR]` flag captures pprof data plus concrete
|
||||
performance counters for performance work: `cpu.pprof` (running
|
||||
for the lifetime of the session), plus `heap.pprof` and
|
||||
`goroutine.pprof` snapshots written on shutdown; alongside them,
|
||||
a per-hot-path metrics tracker writes `metrics.jsonl` (one row
|
||||
per second with chunk/byte rates, per-stage mean and max
|
||||
latencies, and cache hit rates) plus a final `metrics.json`
|
||||
aggregate and a human-readable `summary.txt` on exit.
|
||||
Instrumented hot paths: `OnPTYOut`, viewport `renderer.Render`,
|
||||
host stdout writes, libghostty-vt `emulator.Write` / `Title`,
|
||||
sidebar / tab bar / status line draws (with cache-hit
|
||||
accounting), snapshot replays, and the chrome ticker (so you can
|
||||
see how often it fires with nothing to do). Defaults to
|
||||
`$XDG_STATE_HOME/patterm/profile/YYYYMMDD-HHMMSS`. All
|
||||
diagnostics (startup, errors) are written to `profile.log`
|
||||
inside the dir, never to stdout/stderr.
|
||||
- Renderer benchmark suite (`internal/app/bench_test.go`). Three
|
||||
workload fixtures — plain ASCII, SGR-styled lines, and a
|
||||
ratatui-style cursor-shuffling burst — plus an OSC-gate
|
||||
micro-benchmark. Run via `go test -bench=. -benchmem
|
||||
./internal/app/`. Gives a stable reference for the per-chunk
|
||||
cost of the viewport renderer so future changes can be compared
|
||||
apples-to-apples.
|
||||
- "New Terminal" entry in the command palette spawns a bare interactive
|
||||
`$SHELL` pane (kind `terminal`). Unlike "Run process: …" presets,
|
||||
which are session-persistent and reachable via `restart_process`,
|
||||
|
||||
Reference in New Issue
Block a user