Performance
This page documents how we measure performance and how to interpret results. Numbers below are from a high-load workflow with ~1,700 pods and active debugging operations.
Methodology (Read Before Comparing)
- Environment: macOS desktop workflow
- Cluster shape: large pod count and multiple active workloads
- Workload: table navigation, log streaming/search, and context switching
- Metric focus: incident-time responsiveness, not idle screenshots only
Because tools behave differently between idle and incident load, evaluate both states before making adoption decisions.
Memory Profile (Incident-Load Scenario)
| Tool | Observed memory | Notes |
|---|---|---|
| Krust | ~160 MB | Stable during heavy table + logs workflow |
| k9s | ~750 MB in this specific high-load test | Can be much lower in simpler terminal-only sessions |
| Aptakube | ~500 MB+ | Varies by cluster and usage pattern |
| Lens | ~1,250 MB | Higher baseline plus workload overhead |
Important: k9s is often lightweight in basic usage. The figure above reflects one heavy operational scenario, not every k9s session.
Startup
Cold start completes in under 1 second. Lens typically takes 5–30 seconds to become usable.
Rendering
Krust handles 1,700+ pods at a smooth 60 fps. The pod list uses NSTableView, which renders only the ~30 visible rows — O(visible) rather than O(total). Full table recreation completes in ~30 ms.
Log Performance
Logs are stored in a 100K line ring buffer in Rust. Full-text search completes in under 15 ms with no UI thread blocking.
Why It's Fast
- No Electron or web runtime — native macOS app, no browser overhead
- Rust core — all data processing, filtering, sorting done in Rust with zero-copy snapshots
- No garbage collector — Rust has deterministic memory behavior for core data paths
- Swift + AppKit rendering — NSTableView for large tables, SwiftUI for everything else
- HTTP/2 multiplexing — single connection per cluster for all watchers
- Compact data model — ~700 bytes per pod in memory vs ~70 KB for raw K8s objects
How to Reproduce Internally
- Use the same cluster and namespace selection for every tool.
- Capture idle metrics after 3 minutes, then repeat under incident workflow load.
- Measure alert-to-diagnosis time, not just memory snapshots.