rust-performance
Master Rust performance - profiling, benchmarking, and optimization
When & Why to Use This Skill
This Claude skill empowers developers to master Rust performance optimization through advanced profiling, benchmarking, and efficient coding patterns. It provides actionable guidance on using industry-standard tools like Criterion and Flamegraph, alongside best practices for memory management and build configurations to achieve true zero-cost abstractions.
Use Cases
- Performance Benchmarking: Setting up Criterion.rs to accurately measure execution time and identify performance regressions in Rust functions.
- Bottleneck Identification: Utilizing Flamegraphs to visualize CPU usage and pinpoint specific hot paths within complex Rust binaries.
- Memory Optimization: Implementing efficient patterns such as pre-allocation and Cow (Clone-on-Write) to minimize heap allocations and reduce runtime overhead.
- Production Tuning: Configuring Cargo release profiles with Link-Time Optimization (LTO) and optimized codegen units for maximum binary efficiency.
| name | rust-performance |
|---|---|
| description | Master Rust performance - profiling, benchmarking, and optimization |
| sasmp_version | "1.3.0" |
| bonded_agent | rust-debugger-agent |
| bond_type | SECONDARY_BOND |
| version | "1.0.0" |
Rust Performance Skill
Master performance optimization: profiling, benchmarking, and zero-cost abstractions.
Quick Start
Benchmarking
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
[[bench]]
name = "my_bench"
harness = false
use criterion::{criterion_group, criterion_main, Criterion, black_box};
fn benchmark(c: &mut Criterion) {
c.bench_function("fib", |b| {
b.iter(|| fibonacci(black_box(20)))
});
}
criterion_group!(benches, benchmark);
criterion_main!(benches);
Profiling
cargo install flamegraph
cargo flamegraph --bin my-app
Optimization Patterns
Avoid Allocations
// ❌ Allocates each iteration
for s in strings {
result = result + &s;
}
// ✅ Pre-allocate
let mut result = String::with_capacity(total_len);
for s in strings {
result.push_str(&s);
}
Use Iterators
// ❌ Intermediate collection
let v: Vec<_> = data.iter().map(|x| x * 2).collect();
let sum: i32 = v.iter().sum();
// ✅ Lazy chain
let sum: i32 = data.iter().map(|x| x * 2).sum();
Cow for Optional Clone
use std::borrow::Cow;
fn process(input: &str) -> Cow<str> {
if input.contains("bad") {
Cow::Owned(input.replace("bad", "good"))
} else {
Cow::Borrowed(input)
}
}
Release Profile
[profile.release]
lto = true
codegen-units = 1
opt-level = 3
Troubleshooting
| Problem | Solution |
|---|---|
| Slow debug | Use --release |
| Memory spikes | Use streaming |
| Cache misses | Improve data layout |