К основному содержанию
скилл CX Codex

rust-profiling — скилл для Claude Code: профилирование Rust

Скилл для анализа производительности Rust: флеймграфы, размер бинарника, раздувание мономорфизации и микробенчмарки Criterion.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add mohitmishra786/low-level-dev-skills --skill rust-profiling -a claude-code
Открыть на GitHub

Что делает rust-profiling

Скилл ведёт агента по шагам профилирования Rust-кода. Сначала сборка с отладочными символами — без них профиль читается плохо, поэтому в Cargo.toml нужен профиль вроде release-with-debug или переменная CARGO_PROFILE_RELEASE_DEBUG=true. Дальше флеймграфы через cargo flamegraph: на Linux он опирается на perf, на macOS — на DTrace, и в обоих случаях требуются права sudo.

Отдельные разделы посвящены размеру бинарника и мономорфизации. cargo bloat показывает, какие функции и крейты занимают больше всего места, а cargo llvm-lines считает строки LLVM IR и число копий — высокий счётчик Copies означает, что дженерик размножился под каждый тип. В скилле есть пример, как вынести тело в конкретную внутреннюю функцию и оставить тонкую обёртку.

Для замеров времени — Criterion с harness = false и black_box, чтобы компилятор не выбросил код. Ещё описаны perf record/perf report, heaptrack и DHAT для аллокаций. Учтите: cargo flamegraph придётся ставить отдельно через cargo install flamegraph, а на Linux перед запуском нужно выставить perf_event_paranoid в 1 — иначе perf не соберёт сэмплы.

Какие задачи решает

  • построить флеймграф для Rust-бинарника
  • найти, из-за чего бинарник разросся
  • посчитать раздувание мономорфизации по копиям функций
  • написать микробенчмарк на Criterion с чёрным ящиком
  • разобрать аллокации через heaptrack или DHAT

Примеры запросов агенту

  • Собери флеймграф для myapp и покажи самые горячие функции
  • Прогони cargo bloat --release --crates и объясни, какой крейт занимает больше всего
  • Напиши Criterion-бенчмарк для функции process с разными размерами входа

Как установить rust-profiling

1Через Skills CLI (Vercel)

npx skills add mohitmishra786/low-level-dev-skills --skill rust-profiling -a claude-code

2Вручную: положить файлы

~/.claude/skills/rust-profiling/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/rust-profiling/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о rust-profiling

Как установить rust-profiling в Claude?

Выполните npx skills add mohitmishra786/low-level-dev-skills --skill rust-profiling -a claude-code. Скилл окажется в ~/.claude/skills/rust-profiling/SKILL.md.

Что делает rust-profiling?

Проводит агента через профилирование Rust: сборка с отладочными символами, флеймграфы, анализ размера бинарника, замер мономорфизации и микробенчмарки.

Что нужно для работы скилла?

Инструменты ставятся отдельно: cargo install flamegraph, cargo install cargo-bloat, cargo install cargo-llvm-lines. Для флеймграфов на Linux нужен perf с perf_event_paranoid не выше 1, на macOS — sudo для DTrace.

Исходный текст

SKILL.md · MIT
---
name: rust-profiling
description: Rust profiling skill for performance analysis. Use when generating flamegraphs from Rust binaries, measuring monomorphization bloat with cargo-llvm-lines, analysing binary size with cargo-bloat, microbenchmarking with Criterion, or interpreting inlined frames in profiles. Activates on queries about cargo flamegraph, cargo-bloat, cargo-llvm-lines, Criterion benchmarks, Rust performance profiling, or binary size analysis.
---

# Rust Profiling

## Purpose

Guide agents through Rust performance profiling: flamegraphs via cargo-flamegraph, binary size analysis, monomorphization bloat measurement, Criterion microbenchmarks, and interpreting profiling results with inlined Rust frames.

## Triggers

- "How do I generate a flamegraph for a Rust program?"
- "My Rust binary is huge — how do I find what's causing it?"
- "How do I write Criterion benchmarks?"
- "How do I measure monomorphization bloat?"
- "Rust performance is worse than expected — how do I profile it?"
- "How do I use perf with Rust?"

## Workflow

### 1. Build for profiling

```bash
# Release with debug symbols (needed for readable profiles)
# Cargo.toml:
[profile.release-with-debug]
inherits = "release"
debug = true

cargo build --profile release-with-debug

# Or quick: release + debug info inline
CARGO_PROFILE_RELEASE_DEBUG=true cargo build --release
```

### 2. Flamegraphs with cargo-flamegraph

```bash
# Install
cargo install flamegraph

# Linux: uses perf (requires perf_event_paranoid ≤ 1)
sudo sh -c 'echo 1 > /proc/sys/kernel/perf_event_paranoid'
cargo flamegraph --bin myapp -- arg1 arg2

# macOS: uses DTrace (requires sudo)
sudo cargo flamegraph --bin myapp -- arg1 arg2

# Profile tests
cargo flamegraph --test mytest -- test_filter

# Profile benchmarks
cargo flamegraph --bench mybench -- --bench

# Output
# Generates flamegraph.svg in current directory
# Open in browser: firefox flamegraph.svg
```

Custom flamegraph options:
```bash
# More samples
cargo flamegraph --freq 1000 --bin myapp

# Filter to specific threads
cargo flamegraph --bin myapp -- args 2>/dev/null

# Using perf directly for more control
perf record -g -F 999 ./target/release-with-debug/myapp args
perf script | stackcollapse-perf.pl | flamegraph.pl > out.svg
```

### 3. Binary size analysis with cargo-bloat

```bash
# Install
cargo install cargo-bloat

# Show top functions by size
cargo bloat --release -n 20

# Show per-crate size breakdown
cargo bloat --release --crates

# Include only specific crate
cargo bloat --release --filter myapp

# Compare before/after a change
cargo bloat --release --crates > before.txt
# make changes
cargo bloat --release --crates > after.txt
diff before.txt after.txt
```

Typical output:
```
 File  .text    Size    Crate Name
 2.4%   3.0% 47.0KiB      std <std macros>
 1.8%   2.3% 35.5KiB   myapp myapp::heavy_module::process
 1.2%   1.5% 23.1KiB    serde serde::de::...
```

### 4. Monomorphization bloat with cargo-llvm-lines

```bash
# Install
cargo install cargo-llvm-lines

# Show LLVM IR line counts (proxy for monomorphization)
cargo llvm-lines --release | head -40

# Filter to your crate only
cargo llvm-lines --release | grep '^myapp'
```

Typical output:
```
   Lines      Copies  Function name
   85330           1  [LLVM passes]
    7761          92  core::fmt::write
    4672          11  myapp::process::<impl MyTrait for T>
    3201          47  <alloc::vec::Vec<T> as core::ops::Drop>::drop
```

High `Copies` count = monomorphization expansion. Fix:
```rust
// Before: generic, gets monomorphized for every T
fn process<T: AsRef<[u8]>>(data: T) -> usize {
    do_work(data.as_ref())
}

// After: thin generic wrapper + concrete inner
fn process<T: AsRef<[u8]>>(data: T) -> usize {
    fn inner(data: &[u8]) -> usize { do_work(data) }
    inner(data.as_ref())
}
```

### 5. Criterion microbenchmarks

```toml
# Cargo.toml
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }

[[bench]]
name = "my_bench"
harness = false
```

```rust
// benches/my_bench.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion, BenchmarkId};

fn bench_process(c: &mut Criterion) {
    // Simple benchmark
    c.bench_function("process 1000 items", |b| {
        let data: Vec<i32> = (0..1000).collect();
        b.iter(|| process(black_box(&data)))  // black_box prevents optimization
    });
}

fn bench_sizes(c: &mut Criterion) {
    let mut group = c.benchmark_group("process_sizes");

    for size in [100, 1000, 10000].iter() {
        let data: Vec<i32> = (0..*size).collect();
        group.bench_with_input(
            BenchmarkId::from_parameter(size),
            &data,
            |b, data| b.iter(|| process(black_box(data))),
        );
    }
    group.finish();
}

criterion_group!(benches, bench_process, bench_sizes);
criterion_main!(benches);
```

```bash
# Run all benchmarks
cargo bench

# Run specific benchmark
cargo bench --bench my_bench

# Run with filter
cargo bench -- process_sizes

# Compare with baseline (save/load)
cargo bench -- --save-baseline before
# make changes
cargo bench -- --baseline before

# View HTML report
open target/criterion/report/index.html
```

### 6. perf with Rust (Linux)

```bash
# Record
perf record -g ./target/release-with-debug/myapp args
perf record -g -F 999 ./target/release-with-debug/myapp args  # higher freq

# Report
perf report                     # interactive TUI
perf report --stdio --no-call-graph | head -40   # text

# Annotate specific function
perf annotate myapp::hot_function

# stat (quick counters)
perf stat ./target/release/myapp args
```

Rust-specific perf tips:
- Build with `debug = 1` (line tables only) for faster builds with line-level attribution
- Use `RUSTFLAGS="-C force-frame-pointers=yes"` for better call graphs without DWARF unwinding
- Disable ASLR for reproducible addresses: `setarch $(uname -m) -R ./myapp`

### 7. heaptrack / DHAT for allocations

```bash
# heaptrack (Linux)
heaptrack ./target/release/myapp args
heaptrack_print heaptrack.myapp.*.zst | head -50

# DHAT via Valgrind
valgrind --tool=dhat ./target/debug/myapp args
# Open dhat-out.* with dh_view.html
```

For flamegraph setup and Criterion configuration, see [references/cargo-flamegraph-setup.md](references/cargo-flamegraph-setup.md).

## Related skills

- Use `skills/rust/rustc-basics` for build configuration (debug symbols, profiles)
- Use `skills/profilers/linux-perf` for perf fundamentals
- Use `skills/profilers/flamegraphs` for reading and interpreting flamegraph SVGs
- Use `skills/profilers/valgrind` for allocation profiling with massif/DHAT

© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills

Похожие скиллы

Все скиллы по теме «Языки программирования» →
m10-performance actionbook Инструкции для агента по оптимизации Rust-кода: от замеров через бенчмарки до устранения лишних аллокаций памяти. CX Codex +1 3 600установок 161-java-profiling-detect Juan Antonio Breña Moral Скилл ставит сбор данных о производительности Java-приложения: CPU, память, блокировки, GC и I/O. Пригодится, когда код тормозит и надо понять почему. CX Codex +1 337установок rust-best-practices apollographql Скилл для написания и ревью Rust-кода по хендбуку Apollo GraphQL: заимствование против клонирования, обработка ошибок, тесты. CX Codex +1 21 100установок rust-engineer https://github.com/Jeffallan Направляет агента писать и проверять идиоматичный код на Rust 2021. Помогает настроить времена жизни, связать трейты и развернуть асинхронный сервис на tokio. CX Codex +1 6 300установок rust-deps-visualizer actionbook Рисует дерево зависимостей Rust-проекта символами ASCII. Пригодится, когда нужно быстро понять, что тянет за собой ваш Cargo.toml. CX Codex +1 3 000установок rust Fandhe-AI Скилл подкладывает агенту структурированную документацию по Rust: язык, Cargo, rustc, unsafe и async. Пригодится, когда правишь крейт или разбираешься с владением и лайфтаймами. CX Codex +1 922установок

Из того же набора62

msvc-cl Подсказывает агенту, как компилировать C и C++ через MSVC cl.exe и clang-cl: флаги, рантайм, PDB, ошибки линковки. CX Codex +1 617установок linkers-lto Скилл для настройки линкеров GNU ld, gold и lld, разбора ошибок порядка библиотек и включения LTO в реальных проектах. CX Codex +1 608установок binutils Скилл для работы с бинарниками: статические библиотеки, strip, objcopy, addr2line, strings и c++filt. Пригодится, когда агент должен сам разобраться с постобработкой ELF. CX Codex +1 608установок dynamic-linking Скилл для работы с динамической линковкой в Linux: разбирает ошибки загрузки .so, настройку RPATH и RUNPATH, версионирование soname. CX Codex +1 600установок interpreters Подсказывает агенту, как устроить диспетчеризацию байткода, стековую или регистровую ВМ и простой JIT через mmap. CX Codex +1 564установок rust-ffi Ведёт агента по FFI между Rust и C: генерация биндингов через bindgen и cbindgen, безопасные обёртки, линковка системных библиотек. CX Codex +1 563установок meson Скилл для ИИ-агентов, который помогает настроить Meson, разобраться с wrap-зависимостями и кросс-компиляцией в C/C++ проектах. CX Codex +1 560установок cargo-workflows Скилл ведёт агента по воркспейсам Cargo, фичам, build.rs, кэшу сборки и аудиту зависимостей. Пригодится, когда Rust-проект разрастается до нескольких крейтов. CX Codex +1 558установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой