| name | performance |
| description | RTK CLI performance analysis and optimization. Startup time (<10ms), binary size (<5MB), regex compilation, memory usage. Use when adding dependencies, changing initialization, or suspecting regressions. |
| triggers | ["startup time","performance regression","too slow","benchmark","binary size","memory usage"] |
| allowed-tools | ["Bash","Read","Grep"] |
| effort | medium |
| tags | ["performance","benchmark","startup","binary-size","memory","rtk"] |
RTK Performance Analysis
Hard Targets (Non-Negotiable)
| Metric | Target | Blocker |
|---|
| Startup time | <10ms | Release blocker |
| Binary size (stripped) | <5MB | Release blocker |
| Memory (resident) | <5MB | Release blocker |
| Token savings per filter | ≥60% | Release blocker |
Benchmark Startup Time
brew install hyperfine
hyperfine 'rtk git status' --warmup 3 --export-json /tmp/before.json
cargo build --release
hyperfine 'target/release/rtk git status' 'rtk git status' --warmup 3
Check Binary Size
cargo build --release
ls -lh target/release/rtk
cargo bloat --release --crates
cargo bloat --release -n 20
Memory Usage
/usr/bin/time -l target/release/rtk git status 2>&1 | grep "maximum resident"
/usr/bin/time -v target/release/rtk git status 2>&1 | grep "Maximum resident"
Regex Compilation Audit
Regex compilation on every function call is a common perf killer:
grep -n "Regex::new" src/*.rs
fn filter_line(line: &str) -> bool {
let re = Regex::new(r"^error").unwrap();
re.is_match(line)
}
lazy_static! {
static ref ERROR_RE: Regex = Regex::new(r"^error").unwrap();
}
fn filter_line(line: &str) -> bool {
ERROR_RE.is_match(line)
}
Dependency Impact Assessment
Before adding any new crate:
hyperfine 'rtk git status' --warmup 3
cargo build --release
hyperfine 'target/release/rtk git status' --warmup 3
Forbidden dependencies
| Crate | Reason | Alternative |
|---|
tokio | +5-10ms startup | Blocking std::process::Command |
async-std | +5-10ms startup | Blocking I/O |
rayon | Thread pool init overhead | Sequential iteration |
reqwest | Pulls tokio | ureq (blocking) if HTTP needed |
Dependency weight check
cargo build --release --timings
Allocation Profiling
instruments -t Allocations target/release/rtk git log -10
cargo install cargo-instruments
cargo instruments --release -t Allocations -- git log -10
Common RTK allocation hotspots:
let lines: Vec<String> = input.lines().map(|l| l.to_string()).collect();
let lines: Vec<&str> = input.lines().collect();
let raw_copy = output.stdout.clone();
let display = &output.stdout;
Token Savings Measurement
fn count_tokens(text: &str) -> usize {
text.split_whitespace().count()
}
#[test]
fn test_savings_claim() {
let input = include_str!("../tests/fixtures/mycmd_raw.txt");
let output = filter_output(input).unwrap();
let input_tokens = count_tokens(input);
let output_tokens = count_tokens(&output);
let savings = 100.0 * (1.0 - output_tokens as f64 / input_tokens as f64);
assert!(
savings >= 60.0,
"Expected ≥60% savings, got {:.1}% ({} → {} tokens)",
savings, input_tokens, output_tokens
);
}
Before/After Regression Check
Template for any performance-sensitive change:
cargo build --release
hyperfine 'target/release/rtk git status' --warmup 5 --export-json /tmp/before.json
/usr/bin/time -l target/release/rtk git status 2>&1 | grep "maximum resident"
ls -lh target/release/rtk
cargo build --release
hyperfine 'target/release/rtk git status' --warmup 5 --export-json /tmp/after.json
/usr/bin/time -l target/release/rtk git status 2>&1 | grep "maximum resident"
ls -lh target/release/rtk