[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C55HT3SKMA7DW2NVCXHG3C":3,"skill-same:01M6C55HT3SKMA7DW2NVCXHG3C":51},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6C55HT3SKMA7DW2NVCXHG3C","performance",null,"CLI performance optimization - startup time, memory usage, token savings benchmarking","MDMAtk\u002FTormentNexus","MDMAtk","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F288684999?v=4","01M6C54H4AG0BYB3HTFA4C0CBJ","01M6C54H8146YDG94N9KWXV521",13,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fperformance\u002FSKILL.md",[],[5,18,19,20,21,22,23,24],"cli","memory","benchmarking","savings","Optimization","startup","performance optimization","2026-11-10 10:12:30",false,"---\ndescription: CLI performance optimization - startup time, memory usage, token savings benchmarking\n---\n\n# Performance Optimization Skill\n\nSystematic performance analysis and optimization for RTK CLI tool, focusing on **startup time (\u003C10ms)**, **memory usage (\u003C5MB)**, and **token savings (60-90%)**.\n\n## When to Use\n\n- **Automatically triggered**: After filter changes, regex modifications, or dependency additions\n- **Manual invocation**: When performance degradation suspected or before release\n- **Proactive**: After any code change that could impact startup time or memory\n\n## RTK Performance Targets\n\n| Metric | Target | Verification Method | Failure Threshold |\n|--------|--------|---------------------|-------------------|\n| **Startup time** | \u003C10ms | `hyperfine 'rtk \u003Ccmd>'` | >15ms = blocker |\n| **Memory usage** | \u003C5MB resident | `\u002Fusr\u002Fbin\u002Ftime -l rtk \u003Ccmd>` (macOS) | >7MB = blocker |\n| **Token savings** | 60-90% | Tests with `count_tokens()` | \u003C60% = blocker |\n| **Binary size** | \u003C5MB stripped | `ls -lh target\u002Frelease\u002Frtk` | >8MB = investigate |\n\n## Performance Analysis Workflow\n\n### 1. Establish Baseline\n\nBefore making any changes, capture current performance:\n\n```bash\n# Startup time baseline\nhyperfine 'rtk git status' --warmup 3 --export-json \u002Ftmp\u002Fbaseline_startup.json\n\n# Memory usage baseline (macOS)\n\u002Fusr\u002Fbin\u002Ftime -l rtk git status 2>&1 | grep \"maximum resident set size\" > \u002Ftmp\u002Fbaseline_memory.txt\n\n# Memory usage baseline (Linux)\n\u002Fusr\u002Fbin\u002Ftime -v rtk git status 2>&1 | grep \"Maximum resident set size\" > \u002Ftmp\u002Fbaseline_memory.txt\n\n# Binary size baseline\nls -lh target\u002Frelease\u002Frtk | tee \u002Ftmp\u002Fbaseline_binary_size.txt\n```\n\n### 2. Make Changes\n\nImplement optimization or feature changes.\n\n### 3. Rebuild and Measure\n\n```bash\n# Rebuild with optimizations\ncargo build --release\n\n# Measure startup time\nhyperfine 'target\u002Frelease\u002Frtk git status' --warmup 3 --export-json \u002Ftmp\u002Fafter_startup.json\n\n# Measure memory usage\n\u002Fusr\u002Fbin\u002Ftime -l target\u002Frelease\u002Frtk git status 2>&1 | grep \"maximum resident set size\" > \u002Ftmp\u002Fafter_memory.txt\n\n# Check binary size\nls -lh target\u002Frelease\u002Frtk | tee \u002Ftmp\u002Fafter_binary_size.txt\n```\n\n### 4. Compare Results\n\n```bash\n# Startup time comparison\nhyperfine 'rtk git status' 'target\u002Frelease\u002Frtk git status' --warmup 3\n\n# Example output:\n#   Benchmark 1: rtk git status\n#     Time (mean ± σ):       6.2 ms ±   0.3 ms    [User: 4.1 ms, System: 1.8 ms]\n#   Benchmark 2: target\u002Frelease\u002Frtk git status\n#     Time (mean ± σ):       7.8 ms ±   0.4 ms    [User: 5.2 ms, System: 2.1 ms]\n#\n#   Summary\n#     'rtk git status' ran 1.26 times faster than 'target\u002Frelease\u002Frtk git status'\n\n# Memory comparison\ndiff \u002Ftmp\u002Fbaseline_memory.txt \u002Ftmp\u002Fafter_memory.txt\n\n# Binary size comparison\ndiff \u002Ftmp\u002Fbaseline_binary_size.txt \u002Ftmp\u002Fafter_binary_size.txt\n```\n\n### 5. Identify Regressions\n\n**Startup time regression** (>15% increase or >2ms absolute):\n```bash\n# Profile with flamegraph\ncargo install flamegraph\ncargo flamegraph -- target\u002Frelease\u002Frtk git status\n\n# Open flamegraph.svg\nopen flamegraph.svg\n# Look for:\n# - Regex compilation (should be in lazy_static init)\n# - Excessive allocations\n# - File I\u002FO on startup (should be zero)\n```\n\n**Memory regression** (>20% increase or >1MB absolute):\n```bash\n# Profile allocations (requires nightly)\ncargo +nightly build --release -Z build-std\nRUSTFLAGS=\"-C link-arg=-fuse-ld=lld\" cargo +nightly build --release\n\n# Use DHAT for heap profiling\ncargo install dhat\n# Add to main.rs:\n# #[global_allocator]\n# static ALLOC: dhat::Alloc = dhat::Alloc;\n```\n\n**Token savings regression** (\u003C60% savings):\n```bash\n# Run token accuracy tests\ncargo test test_token_savings\n\n# Example failure output:\n# Git log filter: expected ≥60% savings, got 52.3%\n\n# Fix: Improve filter condensation logic\n```\n\n## Common Performance Issues\n\n### Issue 1: Regex Recompilation\n\n**Symptom**: Startup time >20ms, flamegraph shows regex compilation in hot path\n\n**Detection**:\n```bash\n# Flamegraph shows Regex::new() calls during execution\ncargo flamegraph -- target\u002Frelease\u002Frtk git log -10\n# Look for \"regex::Regex::new\" in non-lazy_static sections\n```\n\n**Fix**:\n```rust\n\u002F\u002F ❌ WRONG: Recompiled on every call\nfn filter_line(line: &str) -> Option\u003C&str> {\n    let re = Regex::new(r\"pattern\").unwrap(); \u002F\u002F RECOMPILED!\n    re.find(line).map(|m| m.as_str())\n}\n\n\u002F\u002F ✅ RIGHT: Compiled once with lazy_static\nuse lazy_static::lazy_static;\n\nlazy_static! {\n    static ref LINE_PATTERN: Regex = Regex::new(r\"pattern\").unwrap();\n}\n\nfn filter_line(line: &str) -> Option\u003C&str> {\n    LINE_PATTERN.find(line).map(|m| m.as_str())\n}\n```\n\n### Issue 2: Excessive Allocations\n\n**Symptom**: Memory usage >5MB, many small allocations in flamegraph\n\n**Detection**:\n```bash\n# DHAT heap profiling\ncargo +nightly build --release\nvalgrind --tool=dhat target\u002Frelease\u002Frtk git status\n```\n\n**Fix**:\n```rust\n\u002F\u002F ❌ WRONG: Allocates Vec for every line\nfn filter_lines(input: &str) -> String {\n    input.lines()\n        .map(|line| line.to_string()) \u002F\u002F Allocates String\n        .collect::\u003CVec\u003C_>>()\n        .join(\"\\n\")\n}\n\n\u002F\u002F ✅ RIGHT: Borrow slices, single allocation\nfn filter_lines(input: &str) -> String {\n    input.lines()\n        .collect::\u003CVec\u003C_>>() \u002F\u002F Vec of &str (no String allocation)\n        .join(\"\\n\")\n}\n```\n\n### Issue 3: Startup I\u002FO\n\n**Symptom**: Startup time varies wildly (5ms to 50ms), flamegraph shows file reads\n\n**Detection**:\n```bash\n# strace on Linux\nstrace -c target\u002Frelease\u002Frtk git status 2>&1 | grep -E \"open|read\"\n\n# dtrace on macOS (requires SIP disabled)\nsudo dtrace -n 'syscall::open*:entry { @[execname] = count(); }' &\ntarget\u002Frelease\u002Frtk git status\nsudo pkill dtrace\n```\n\n**Fix**:\n```rust\n\u002F\u002F ❌ WRONG: File I\u002FO on startup\nfn main() {\n    let config = load_config().unwrap(); \u002F\u002F Reads ~\u002F.config\u002Frtk\u002Fconfig.toml\n    \u002F\u002F ...\n}\n\n\u002F\u002F ✅ RIGHT: Lazy config loading (only if needed)\nfn main() {\n    \u002F\u002F No I\u002FO on startup\n    \u002F\u002F Config loaded on-demand when first accessed\n}\n```\n\n### Issue 4: Dependency Bloat\n\n**Symptom**: Binary size >5MB, many unused dependencies in `Cargo.toml`\n\n**Detection**:\n```bash\n# Analyze dependency tree\ncargo tree\n\n# Find heavy dependencies\ncargo install cargo-bloat\ncargo bloat --release --crates\n\n# Example output:\n#  File  .text     Size Crate\n#  0.5%   2.1%  42.3KB regex\n#  0.4%   1.8%  36.1KB clap\n# ...\n```\n\n**Fix**:\n```toml\n# ❌ WRONG: Full feature set (bloat)\n[dependencies]\nclap = { version = \"4\", features = [\"derive\", \"color\", \"suggestions\"] }\n\n# ✅ RIGHT: Minimal features\n[dependencies]\nclap = { version = \"4\", features = [\"derive\"], default-features = false }\n```\n\n## Optimization Techniques\n\n### Technique 1: Lazy Static Initialization\n\n**Use case**: Regex patterns, static configuration, one-time allocations\n\n**Implementation**:\n```rust\nuse lazy_static::lazy_static;\nuse regex::Regex;\n\nlazy_static! {\n    static ref COMMIT_HASH: Regex = Regex::new(r\"[0-9a-f]{7,40}\").unwrap();\n    static ref AUTHOR_LINE: Regex = Regex::new(r\"^Author: (.+)$\").unwrap();\n    static ref DATE_LINE: Regex = Regex::new(r\"^Date: (.+)$\").unwrap();\n}\n\n\u002F\u002F All regex compiled once at startup, reused forever\n```\n\n**Impact**: ~5-10ms saved per regex pattern (if compiled at runtime)\n\n### Technique 2: Zero-Copy String Processing\n\n**Use case**: Filter output without allocating intermediate Strings\n\n**Implementation**:\n```rust\n\u002F\u002F ❌ WRONG: Allocates String for every line\nfn filter(input: &str) -> String {\n    input.lines()\n        .filter(|line| !line.is_empty())\n        .map(|line| line.to_string()) \u002F\u002F Allocates!\n        .collect::\u003CVec\u003C_>>()\n        .join(\"\\n\")\n}\n\n\u002F\u002F ✅ RIGHT: Borrow slices, single final allocation\nfn filter(input: &str) -> String {\n    input.lines()\n        .filter(|line| !line.is_empty())\n        .collect::\u003CVec\u003C_>>() \u002F\u002F Vec\u003C&str> (no String alloc)\n        .join(\"\\n\") \u002F\u002F Single allocation for joined result\n}\n```\n\n**Impact**: ~1-2MB memory saved, ~1-2ms startup saved\n\n### Technique 3: Minimal Dependencies\n\n**Use case**: Reduce binary size and compile time\n\n**Implementation**:\n```toml\n# Only include features you actually use\n[dependencies]\nclap = { version = \"4\", features = [\"derive\"], default-features = false }\nserde = { version = \"1\", features = [\"derive\"], default-features = false }\n\n# Avoid heavy dependencies\n# ❌ Avoid: tokio (adds 5-10ms startup overhead)\n# ❌ Avoid: full regex (use regex-lite if possible)\n# ✅ Use: anyhow (lightweight error handling)\n# ✅ Use: lazy_static (zero runtime overhead)\n```\n\n**Impact**: ~1-2MB binary size reduction, ~2-5ms startup saved\n\n## Performance Testing Checklist\n\nBefore committing filter changes:\n\n### Startup Time\n- [ ] Benchmark with `hyperfine 'rtk \u003Ccmd>' --warmup 3`\n- [ ] Verify \u003C10ms mean time\n- [ ] Check variance (σ) is small (\u003C1ms)\n- [ ] Compare against baseline (regression \u003C2ms)\n\n### Memory Usage\n- [ ] Profile with `\u002Fusr\u002Fbin\u002Ftime -l rtk \u003Ccmd>`\n- [ ] Verify \u003C5MB resident set size\n- [ ] Compare against baseline (regression \u003C1MB)\n\n### Token Savings\n- [ ] Run `cargo test test_token_savings`\n- [ ] Verify all filters achieve ≥60% savings\n- [ ] Check real fixtures used (not synthetic)\n\n### Binary Size\n- [ ] Check `ls -lh target\u002Frelease\u002Frtk`\n- [ ] Verify \u003C5MB stripped binary\n- [ ] Run `cargo bloat --release --crates` if >5MB\n\n## Continuous Performance Monitoring\n\n### Pre-Commit Hook\n\nAdd to `.claude\u002Fhooks\u002Fbash\u002Fpre-commit-performance.sh`:\n\n```bash\n#!\u002Fbin\u002Fbash\n# Performance regression check before commit\n\necho \"? Running performance checks...\"\n\n# Benchmark startup time\nCURRENT_TIME=$(hyperfine 'rtk git status' --warmup 3 --export-json \u002Ftmp\u002Fperf.json 2>&1 | grep \"Time (mean\" | awk '{print $4}')\n\n# Extract numeric value (remove \"ms\")\nCURRENT_MS=$(echo $CURRENT_TIME | sed 's\u002Fms\u002F\u002F')\n\n# Check if > 10ms\nif (( $(echo \"$CURRENT_MS > 10\" | bc -l) )); then\n    echo \"❌ Startup time regression: ${CURRENT_MS}ms (target: \u003C10ms)\"\n    exit 1\nfi\n\n# Check binary size\nBINARY_SIZE=$(ls -l target\u002Frelease\u002Frtk | awk '{print $5}')\nMAX_SIZE=$((5 * 1024 * 1024))  # 5MB\n\nif [ $BINARY_SIZE -gt $MAX_SIZE ]; then\n    echo \"❌ Binary size regression: $(($BINARY_SIZE \u002F 1024 \u002F 1024))MB (target: \u003C5MB)\"\n    exit 1\nfi\n\necho \"✅ Performance checks passed\"\n```\n\n### CI\u002FCD Integration\n\nAdd to `.github\u002Fworkflows\u002Fci.yml`:\n\n```yaml\n- name: Performance Regression Check\n  run: |\n    cargo build --release\n    cargo install hyperfine\n\n    # Benchmark startup time\n    hyperfine 'target\u002Frelease\u002Frtk git status' --warmup 3 --max-runs 10\n\n    # Check binary size\n    BINARY_SIZE=$(ls -l target\u002Frelease\u002Frtk | awk '{print $5}')\n    MAX_SIZE=$((5 * 1024 * 1024))\n    if [ $BINARY_SIZE -gt $MAX_SIZE ]; then\n      echo \"Binary too large: $(($BINARY_SIZE \u002F 1024 \u002F 1024))MB\"\n      exit 1\n    fi\n```\n\n## Performance Optimization Priorities\n\n**Priority order** (highest to lowest impact):\n\n1. **? Lazy static regex** (5-10ms per pattern if compiled at runtime)\n2. **? Remove startup I\u002FO** (10-50ms for config file reads)\n3. **? Zero-copy processing** (1-2MB memory, 1-2ms startup)\n4. **? Minimal dependencies** (1-2MB binary, 2-5ms startup)\n5. **? Algorithm optimization** (varies, measure first)\n\n**When in doubt**: Profile first with `flamegraph`, then optimize the hottest path.\n\n## Tools Reference\n\n| Tool | Purpose | Command |\n|------|---------|---------|\n| **hyperfine** | Benchmark startup time | `hyperfine 'rtk \u003Ccmd>' --warmup 3` |\n| **time** | Memory usage (macOS) | `\u002Fusr\u002Fbin\u002Ftime -l rtk \u003Ccmd>` |\n| **time** | Memory usage (Linux) | `\u002Fusr\u002Fbin\u002Ftime -v rtk \u003Ccmd>` |\n| **flamegraph** | CPU profiling | `cargo flamegraph -- rtk \u003Ccmd>` |\n| **cargo bloat** | Binary size analysis | `cargo bloat --release --crates` |\n| **cargo tree** | Dependency tree | `cargo tree` |\n| **DHAT** | Heap profiling | `cargo +nightly build && valgrind --tool=dhat` |\n| **strace** | System call tracing (Linux) | `strace -c target\u002Frelease\u002Frtk \u003Ccmd>` |\n| **dtrace** | System call tracing (macOS) | `sudo dtrace -n 'syscall::open*:entry'` |\n\n**Install tools**:\n```bash\n# macOS\nbrew install hyperfine\n\n# Linux \u002F cross-platform via cargo\ncargo install hyperfine\ncargo install flamegraph\ncargo install cargo-bloat\n```\n","# Performance Optimization Skill\n\nSystematic performance analysis and optimization for RTK CLI tool, focusing on **startup time (\u003C10ms)**, **memory usage (\u003C5MB)**, and **token savings (60-90%)**.\n\n## When to Use\n\n- **Automatically triggered**: After filter changes, regex modifications, or dependency additions\n- **Manual invocation**: When performance degradation suspected or before release\n- **Proactive**: After any code change that could impact startup time or memory\n\n## RTK Performance Targets\n\n| Metric | Target | Verification Method | Failure Threshold |\n|--------|--------|---------------------|-------------------|\n| **Startup time** | \u003C10ms | `hyperfine 'rtk \u003Ccmd>'` | >15ms = blocker |\n| **Memory usage** | \u003C5MB resident | `\u002Fusr\u002Fbin\u002Ftime -l rtk \u003Ccmd>` (macOS) | >7MB = blocker |\n| **Token savings** | 60-90% | Tests with `count_tokens()` | \u003C60% = blocker |\n| **Binary size** | \u003C5MB stripped | `ls -lh target\u002Frelease\u002Frtk` | >8MB = investigate |\n\n## Performance Analysis Workflow\n\n### 1. Establish Baseline\n\nBefore making any changes, capture current performance:\n\n```bash\n# Startup time baseline\nhyperfine 'rtk git status' --warmup 3 --export-json \u002Ftmp\u002Fbaseline_startup.json\n\n# Memory usage baseline (macOS)\n\u002Fusr\u002Fbin\u002Ftime -l rtk git status 2>&1 | grep \"maximum resident set size\" > \u002Ftmp\u002Fbaseline_memory.txt\n\n# Memory usage baseline (Linux)\n\u002Fusr\u002Fbin\u002Ftime -v rtk git status 2>&1 | grep \"Maximum resident set size\" > \u002Ftmp\u002Fbaseline_memory.txt\n\n# Binary size baseline\nls -lh target\u002Frelease\u002Frtk | tee \u002Ftmp\u002Fbaseline_binary_size.txt\n```\n\n### 2. Make Changes\n\nImplement optimization or feature changes.\n\n### 3. Rebuild and Measure\n\n```bash\n# Rebuild with optimizations\ncargo build --release\n\n# Measure startup time\nhyperfine 'target\u002Frelease\u002Frtk git status' --warmup 3 --export-json \u002Ftmp\u002Fafter_startup.json\n\n# Measure memory usage\n\u002Fusr\u002Fbin\u002Ftime -l target\u002Frelease\u002Frtk git status 2>&1 | grep \"maximum resident set size\" > \u002Ftmp\u002Fafter_memory.txt\n\n# Check binary size\nls -lh target\u002Frelease\u002Frtk | tee \u002Ftmp\u002Fafter_binary_size.txt\n```\n\n### 4. Compare Results\n\n```bash\n# Startup time comparison\nhyperfine 'rtk git status' 'target\u002Frelease\u002Frtk git status' --warmup 3\n\n# Example output:\n#   Benchmark 1: rtk git status\n#     Time (mean ± σ):       6.2 ms ±   0.3 ms    [User: 4.1 ms, System: 1.8 ms]\n#   Benchmark 2: target\u002Frelease\u002Frtk git status\n#     Time (mean ± σ):       7.8 ms ±   0.4 ms    [User: 5.2 ms, System: 2.1 ms]\n#\n#   Summary\n#     'rtk git status' ran 1.26 times faster than 'target\u002Frelease\u002Frtk git status'\n\n# Memory comparison\ndiff \u002Ftmp\u002Fbaseline_memory.txt \u002Ftmp\u002Fafter_memory.txt\n\n# Binary size comparison\ndiff \u002Ftmp\u002Fbaseline_binary_size.txt \u002Ftmp\u002Fafter_binary_size.txt\n```\n\n### 5. Identify Regressions\n\n**Startup time regression** (>15% increase or >2ms absolute):\n```bash\n# Profile with flamegraph\ncargo install flamegraph\ncargo flamegraph -- target\u002Frelease\u002Frtk git status\n\n# Open flamegraph.svg\nopen flamegraph.svg\n# Look for:\n# - Regex compilation (should be in lazy_static init)\n# - Excessive allocations\n# - File I\u002FO on startup (should be zero)\n```\n\n**Memory regression** (>20% increase or >1MB absolute):\n```bash\n# Profile allocations (requires nightly)\ncargo +nightly build --release -Z build-std\nRUSTFLAGS=\"-C link-arg=-fuse-ld=lld\" cargo +nightly build --release\n\n# Use DHAT for heap profiling\ncargo install dhat\n# Add to main.rs:\n# #[global_allocator]\n# static ALLOC: dhat::Alloc = dhat::Alloc;\n```\n\n**Token savings regression** (\u003C60% savings):\n```bash\n# Run token accuracy tests\ncargo test test_token_savings\n\n# Example failure output:\n# Git log filter: expected ≥60% savings, got 52.3%\n\n# Fix: Improve filter condensation logic\n```\n\n## Common Performance Issues\n\n### Issue 1: Regex Recompilation\n\n**Symptom**: Startup time >20ms, flamegraph shows regex compilation in hot path\n\n**Detection**:\n```bash\n# Flamegraph shows Regex::new() calls during execution\ncargo flamegraph -- target\u002Frelease\u002Frtk git log -10\n# Look for \"regex::Regex::new\" in non-lazy_static sections\n```\n\n**Fix**:\n```rust\n\u002F\u002F ❌ WRONG: Recompiled on every call\nfn filter_line(line: &str) -> Option\u003C&str> {\n    let re = Regex::new(r\"pattern\").unwrap(); \u002F\u002F RECOMPILED!\n    re.find(line).map(|m| m.as_str())\n}\n\n\u002F\u002F ✅ RIGHT: Compiled once with lazy_static\nuse lazy_static::lazy_static;\n\nlazy_static! {\n    static ref LINE_PATTERN: Regex = Regex::new(r\"pattern\").unwrap();\n}\n\nfn filter_line(line: &str) -> Option\u003C&str> {\n    LINE_PATTERN.find(line).map(|m| m.as_str())\n}\n```\n\n### Issue 2: Excessive Allocations\n\n**Symptom**: Memory usage >5MB, many small allocations in flamegraph\n\n**Detection**:\n```bash\n# DHAT heap profiling\ncargo +nightly build --release\nvalgrind --tool=dhat target\u002Frelease\u002Frtk git status\n```\n\n**Fix**:\n```rust\n\u002F\u002F ❌ WRONG: Allocates Vec for every line\nfn filter_lines(input: &str) -> String {\n    input.lines()\n        .map(|line| line.to_string()) \u002F\u002F Allocates String\n        .collect::\u003CVec\u003C_>>()\n        .join(\"\\n\")\n}\n\n\u002F\u002F ✅ RIGHT: Borrow slices, single allocation\nfn filter_lines(input: &str) -> String {\n    input.lines()\n        .collect::\u003CVec\u003C_>>() \u002F\u002F Vec of &str (no String allocation)\n        .join(\"\\n\")\n}\n```\n\n### Issue 3: Startup I\u002FO\n\n**Symptom**: Startup time varies wildly (5ms to 50ms), flamegraph shows file reads\n\n**Detection**:\n```bash\n# strace on Linux\nstrace -c target\u002Frelease\u002Frtk git status 2>&1 | grep -E \"open|read\"\n\n# dtrace on macOS (requires SIP disabled)\nsudo dtrace -n 'syscall::open*:entry { @[execname] = count(); }' &\ntarget\u002Frelease\u002Frtk git status\nsudo pkill dtrace\n```\n\n**Fix**:\n```rust\n\u002F\u002F ❌ WRONG: File I\u002FO on startup\nfn main() {\n    let config = load_config().unwrap(); \u002F\u002F Reads ~\u002F.config\u002Frtk\u002Fconfig.toml\n    \u002F\u002F ...\n}\n\n\u002F\u002F ✅ RIGHT: Lazy config loading (only if needed)\nfn main() {\n    \u002F\u002F No I\u002FO on startup\n    \u002F\u002F Config loaded on-demand when first accessed\n}\n```\n\n### Issue 4: Dependency Bloat\n\n**Symptom**: Binary size >5MB, many unused dependencies in `Cargo.toml`\n\n**Detection**:\n```bash\n# Analyze dependency tree\ncargo tree\n\n# Find heavy dependencies\ncargo install cargo-bloat\ncargo bloat --release --crates\n\n# Example output:\n#  File  .text     Size Crate\n#  0.5%   2.1%  42.3KB regex\n#  0.4%   1.8%  36.1KB clap\n# ...\n```\n\n**Fix**:\n```toml\n# ❌ WRONG: Full feature set (bloat)\n[dependencies]\nclap = { version = \"4\", features = [\"derive\", \"color\", \"suggestions\"] }\n\n# ✅ RIGHT: Minimal features\n[dependencies]\nclap = { version = \"4\", features = [\"derive\"], default-features = false }\n```\n\n## Optimization Techniques\n\n### Technique 1: Lazy Static Initialization\n\n**Use case**: Regex patterns, static configuration, one-time allocations\n\n**Implementation**:\n```rust\nuse lazy_static::lazy_static;\nuse regex::Regex;\n\nlazy_static! {\n    static ref COMMIT_HASH: Regex = Regex::new(r\"[0-9a-f]{7,40}\").unwrap();\n    static ref AUTHOR_LINE: Regex = Regex::new(r\"^Author: (.+)$\").unwrap();\n    static ref DATE_LINE: Regex = Regex::new(r\"^Date: (.+)$\").unwrap();\n}\n\n\u002F\u002F All regex compiled once at startup, reused forever\n```\n\n**Impact**: ~5-10ms saved per regex pattern (if compiled at runtime)\n\n### Technique 2: Zero-Copy String Processing\n\n**Use case**: Filter output without allocating intermediate Strings\n\n**Implementation**:\n```rust\n\u002F\u002F ❌ WRONG: Allocates String for every line\nfn filter(input: &str) -> String {\n    input.lines()\n        .filter(|line| !line.is_empty())\n        .map(|line| line.to_string()) \u002F\u002F Allocates!\n        .collect::\u003CVec\u003C_>>()\n        .join(\"\\n\")\n}\n\n\u002F\u002F ✅ RIGHT: Borrow slices, single final allocation\nfn filter(input: &str) -> String {\n    input.lines()\n        .filter(|line| !line.is_empty())\n        .collect::\u003CVec\u003C_>>() \u002F\u002F Vec\u003C&str> (no String alloc)\n        .join(\"\\n\") \u002F\u002F Single allocation for joined result\n}\n```\n\n**Impact**: ~1-2MB memory saved, ~1-2ms startup saved\n\n### Technique 3: Minimal Dependencies\n\n**Use case**: Reduce binary size and compile time\n\n**Implementation**:\n```toml\n# Only include features you actually use\n[dependencies]\nclap = { version = \"4\", features = [\"derive\"], default-features = false }\nserde = { version = \"1\", features = [\"derive\"], default-features = false }\n\n# Avoid heavy dependencies\n# ❌ Avoid: tokio (adds 5-10ms startup overhead)\n# ❌ Avoid: full regex (use regex-lite if possible)\n# ✅ Use: anyhow (lightweight error handling)\n# ✅ Use: lazy_static (zero runtime overhead)\n```\n\n**Impact**: ~1-2MB binary size reduction, ~2-5ms startup saved\n\n## Performance Testing Checklist\n\nBefore committing filter changes:\n\n### Startup Time\n- [ ] Benchmark with `hyperfine 'rtk \u003Ccmd>' --warmup 3`\n- [ ] Verify \u003C10ms mean time\n- [ ] Check variance (σ) is small (\u003C1ms)\n- [ ] Compare against baseline (regression \u003C2ms)\n\n### Memory Usage\n- [ ] Profile with `\u002Fusr\u002Fbin\u002Ftime -l rtk \u003Ccmd>`\n- [ ] Verify \u003C5MB resident set size\n- [ ] Compare against baseline (regression \u003C1MB)\n\n### Token Savings\n- [ ] Run `cargo test test_token_savings`\n- [ ] Verify all filters achieve ≥60% savings\n- [ ] Check real fixtures used (not synthetic)\n\n### Binary Size\n- [ ] Check `ls -lh target\u002Frelease\u002Frtk`\n- [ ] Verify \u003C5MB stripped binary\n- [ ] Run `cargo bloat --release --crates` if >5MB\n\n## Continuous Performance Monitoring\n\n### Pre-Commit Hook\n\nAdd to `.claude\u002Fhooks\u002Fbash\u002Fpre-commit-performance.sh`:\n\n```bash\n#!\u002Fbin\u002Fbash\n# Performance regression check before commit\n\necho \"? Running performance checks...\"\n\n# Benchmark startup time\nCURRENT_TIME=$(hyperfine 'rtk git status' --warmup 3 --export-json \u002Ftmp\u002Fperf.json 2>&1 | grep \"Time (mean\" | awk '{print $4}')\n\n# Extract numeric value (remove \"ms\")\nCURRENT_MS=$(echo $CURRENT_TIME | sed 's\u002Fms\u002F\u002F')\n\n# Check if > 10ms\nif (( $(echo \"$CURRENT_MS > 10\" | bc -l) )); then\n    echo \"❌ Startup time regression: ${CURRENT_MS}ms (target: \u003C10ms)\"\n    exit 1\nfi\n\n# Check binary size\nBINARY_SIZE=$(ls -l target\u002Frelease\u002Frtk | awk '{print $5}')\nMAX_SIZE=$((5 * 1024 * 1024))  # 5MB\n\nif [ $BINARY_SIZE -gt $MAX_SIZE ]; then\n    echo \"❌ Binary size regression: $(($BINARY_SIZE \u002F 1024 \u002F 1024))MB (target: \u003C5MB)\"\n    exit 1\nfi\n\necho \"✅ Performance checks passed\"\n```\n\n### CI\u002FCD Integration\n\nAdd to `.github\u002Fworkflows\u002Fci.yml`:\n\n```yaml\n- name: Performance Regression Check\n  run: |\n    cargo build --release\n    cargo install hyperfine\n\n    # Benchmark startup time\n    hyperfine 'target\u002Frelease\u002Frtk git status' --warmup 3 --max-runs 10\n\n    # Check binary size\n    BINARY_SIZE=$(ls -l target\u002Frelease\u002Frtk | awk '{print $5}')\n    MAX_SIZE=$((5 * 1024 * 1024))\n    if [ $BINARY_SIZE -gt $MAX_SIZE ]; then\n      echo \"Binary too large: $(($BINARY_SIZE \u002F 1024 \u002F 1024))MB\"\n      exit 1\n    fi\n```\n\n## Performance Optimization Priorities\n\n**Priority order** (highest to lowest impact):\n\n1. **? Lazy static regex** (5-10ms per pattern if compiled at runtime)\n2. **? Remove startup I\u002FO** (10-50ms for config file reads)\n3. **? Zero-copy processing** (1-2MB memory, 1-2ms startup)\n4. **? Minimal dependencies** (1-2MB binary, 2-5ms startup)\n5. **? Algorithm optimization** (varies, measure first)\n\n**When in doubt**: Profile first with `flamegraph`, then optimize the hottest path.\n\n## Tools Reference\n\n| Tool | Purpose | Command |\n|------|---------|---------|\n| **hyperfine** | Benchmark startup time | `hyperfine 'rtk \u003Ccmd>' --warmup 3` |\n| **time** | Memory usage (macOS) | `\u002Fusr\u002Fbin\u002Ftime -l rtk \u003Ccmd>` |\n| **time** | Memory usage (Linux) | `\u002Fusr\u002Fbin\u002Ftime -v rtk \u003Ccmd>` |\n| **flamegraph** | CPU profiling | `cargo flamegraph -- rtk \u003Ccmd>` |\n| **cargo bloat** | Binary size analysis | `cargo bloat --release --crates` |\n| **cargo tree** | Dependency tree | `cargo tree` |\n| **DHAT** | Heap profiling | `cargo +nightly build && valgrind --tool=dhat` |\n| **strace** | System call tracing (Linux) | `strace -c target\u002Frelease\u002Frtk \u003Ccmd>` |\n| **dtrace** | System call tracing (macOS) | `sudo dtrace -n 'syscall::open*:entry'` |\n\n**Install tools**:\n```bash\n# macOS\nbrew install hyperfine\n\n# Linux \u002F cross-platform via cargo\ncargo install hyperfine\ncargo install flamegraph\ncargo install cargo-bloat\n```\n",{"description":7},"main","6079b2fd99329bb8a099e7708b0567b93edf8206","third_party\u002Frtk\u002F.claude\u002Fskills\u002Fperformance",2,"https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus","https:\u002F\u002Fgithub.com\u002FMDMAtk","2026-11-07 14:28:49",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add MDMAtk\u002FTormentNexus --skill performance",{"tool":43,"command":44},"bunx","bunx skills add MDMAtk\u002FTormentNexus --skill performance",{"tool":46,"command":47},"pnpm","pnpm dlx skills add MDMAtk\u002FTormentNexus --skill performance","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fperformance\u002FSKILL.md",true,[],[52,84,99,112,129,146],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":63,"publishedAt":25},"01M6C5659TDGC363E5EWMQZJGZ","tdd-rust","TDD workflow for RTK filter development. Red-Green-Refactor with Rust idioms. Real fixtures, token savings assertions, snapshot tests with insta. Auto-triggers on new filter implementation.","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Ftdd-rust\u002FSKILL.md",[58],{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],"tdd rust","tdd","rust","testing","implement","command","token-savings","snapshots","filters","red-green-refactor","test coverage","auto","fix","coverage","Bash","development","add command","write tests","test","workflow",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":25},"01M6C562NZPX3J6W8F6P4KZMV1","ship","Build, commit, push & version bump workflow - automates the complete release cycle","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fship\u002FSKILL.md",[],[86,91,92,93,94,95,96,78,97,98,83],"push","version","edit","write","read","grep","release","commit",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":25},"01M6C55ZXSNWBB861V5GGYR775","security-guardian","CLI security expert for RTK - command injection, shell escaping, hook security","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fsecurity-guardian\u002FSKILL.md",[],[106,107,108,109,95,78,96,110,111,18,69],"security guardian","guardian","security","rtk","shell","injection",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":25},"01M6C55XHCBK612DXDAD08GGE1","rtk-triage","Triage complet RTK : exécute issue-triage + pr-triage en parallèle, puis croise les données pour détecter doubles couvertures, trous sécurité, P0 sans PR, et conflits internes. Sauvegarde dans claudedocs\u002FRTK-YYYY-MM-DD.md. Args: \"en\"\u002F\"fr\" pour la langue (défaut: fr), \"save\" pour forcer la sauvegarde.","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Frtk-triage\u002FSKILL.md",[],[119,109,120,108,121,95,122,94,78,123,124,125,126,127,128],"rtk triage","triage","orchestration","cross-analysis","save","analysis","sans","dd","issues","pr",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":139,"publishedAt":25},"01M6C55V1RDCNFJ019HRA16ZHM","rtk-tdd","Enforces TDD (Red-Green-Refactor) for Rust development. Auto-triggers on implementation, testing, refactoring, and bug fixing tasks. Provides Rust-idiomatic testing patterns with anyhow\u002Fthiserror, cfg(test), and Arrange-Act-Assert workflow.","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Frtk-tdd\u002FSKILL.md",[135,138],{"categoryNo":136,"categoryName":137,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},[140,109,65,141,67,73,66,75,93,94,95,78,142,143,144,79,145,82,83],"rtk tdd","refactoring","CFG","testing patterns","refactor","tasks",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":25},"01M6C55RQ5QH5MBSYXMC8KF0WV","repo-recap","Generate a comprehensive repo recap (PRs, issues, releases) for sharing with team. Pass \"en\" or \"fr\" as argument for language (default fr).","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Frepo-recap\u002FSKILL.md",[],[153,154,155,78,96,127,156,157,158,95],"repo recap","recap","repo","team","sharing","generate"]