PluginBench
Skill
Pass
Audit score 90

m10-performance

actionbook/rust-skills

Measure, identify bottlenecks, then optimize with data structures, allocation strategies, and parallelism.

What is m10-performance?

Performance optimization in Rust requires profiling first to identify actual bottlenecks, then applying targeted improvements. Use this skill when you need to reduce latency, improve throughput, or optimize memory usage—but always measure before optimizing to avoid wasted effort.

  • Profile and benchmark code using flamegraph, perf, criterion, and cargo bench to identify true bottlenecks
  • Reduce allocations via pre-allocation, object pools, and reuse patterns (Vec::with_capacity, SmallVec)
  • Improve cache efficiency by choosing contiguous data structures and sequential access patterns
  • Parallelize workloads using rayon or threads for data-parallel tasks
  • Eliminate unnecessary copies through references, Cow<T>, and zero-copy designs
  • Choose optimal data structures (Vec over HashMap for small sets, avoid LinkedList)

How to install m10-performance

npx skills add https://github.com/actionbook/rust-skills --skill m10-performance
Claude Code
Cursor
Windsurf
Cline

How to use m10-performance

  1. 1.Profile your code with flamegraph or perf to identify actual bottlenecks—never guess
  2. 2.Benchmark baseline performance using cargo bench or criterion in release mode
  3. 3.Prioritize improvements by impact: algorithm (10x–1000x) > data structure (2x–10x) > allocation (2x–5x) > cache (1.5x–3x)
  4. 4.Apply targeted optimizations: pre-allocate with Vec::with_capacity, use references instead of clones, choose Vec over HashMap for small sets
  5. 5.Re-benchmark after each change to verify improvement and avoid premature optimization

Use cases

Good for
  • Reducing latency in hot code paths identified by profiling
  • Improving throughput for batch processing or high-frequency operations
  • Optimizing memory usage when working with large datasets or embedded constraints
  • Parallelizing CPU-bound computations across multiple cores
  • Eliminating allocation overhead in performance-critical loops
Who it's for
  • Backend engineers optimizing API response times
  • Systems programmers working with performance-critical code
  • Data processing engineers handling large datasets
  • Game developers targeting frame-rate requirements
  • Anyone with measured performance requirements

m10-performance FAQ

Should I optimize before the code works?

No. Make it work first, then measure. Premature optimization wastes effort and adds complexity without proof of benefit.

Why benchmark in release mode?

Debug mode disables optimizations, making benchmarks meaningless. Always use `cargo bench` or `--release` for real performance data.

When should I use SmallVec instead of Vec?

Use SmallVec when collections are usually small (e.g., < 10 items) to avoid heap allocation; it stores small data inline and spills to heap when needed.

What's the fastest data structure?

It depends on your access pattern. Vec is cache-friendly for sequential access; HashMap for lookups; arrays for fixed-size data. Profile to know.

How do I avoid hidden allocations?

Watch for implicit `.clone()` calls, string concatenation in loops, and unnecessary boxing. Use references and `Cow<T>` to avoid copies.

Full instructions (SKILL.md)

Source of truth, from actionbook/rust-skills.


name: m10-performance description: "CRITICAL: Use for performance optimization. Triggers: performance, optimization, benchmark, profiling, flamegraph, criterion, slow, fast, allocation, cache, SIMD, make it faster, 性能优化, 基准测试" user-invocable: false

Performance Optimization

Layer 2: Design Choices

Core Question

What's the bottleneck, and is optimization worth it?

Before optimizing:

  • Have you measured? (Don't guess)
  • What's the acceptable performance?
  • Will optimization add complexity?

Performance Decision → Implementation

GoalDesign ChoiceImplementation
Reduce allocationsPre-allocate, reusewith_capacity, object pools
Improve cacheContiguous dataVec, SmallVec
ParallelizeData parallelismrayon, threads
Avoid copiesZero-copyReferences, Cow<T>
Reduce indirectionInline datasmallvec, arrays

Thinking Prompt

Before optimizing:

  1. Have you measured?

    • Profile first → flamegraph, perf
    • Benchmark → criterion, cargo bench
    • Identify actual hotspots
  2. What's the priority?

    • Algorithm (10x-1000x improvement)
    • Data structure (2x-10x)
    • Allocation (2x-5x)
    • Cache (1.5x-3x)
  3. What's the trade-off?

    • Complexity vs speed
    • Memory vs CPU
    • Latency vs throughput

Trace Up ↑

To domain constraints (Layer 3):

"How fast does this need to be?"
    ↑ Ask: What's the performance SLA?
    ↑ Check: domain-* (latency requirements)
    ↑ Check: Business requirements (acceptable response time)
QuestionTrace ToAsk
Latency requirementsdomain-*What's acceptable response time?
Throughput needsdomain-*How many requests per second?
Memory constraintsdomain-*What's the memory budget?

Trace Down ↓

To implementation (Layer 1):

"Need to reduce allocations"
    ↓ m01-ownership: Use references, avoid clone
    ↓ m02-resource: Pre-allocate with_capacity

"Need to parallelize"
    ↓ m07-concurrency: Choose rayon or threads
    ↓ m07-concurrency: Consider async for I/O-bound

"Need cache efficiency"
    ↓ Data layout: Prefer Vec over HashMap when possible
    ↓ Access patterns: Sequential over random access

Quick Reference

ToolPurpose
cargo benchMicro-benchmarks
criterionStatistical benchmarks
perf / flamegraphCPU profiling
heaptrackAllocation tracking
valgrind / cachegrindCache analysis

Optimization Priority

1. Algorithm choice     (10x - 1000x)
2. Data structure       (2x - 10x)
3. Allocation reduction (2x - 5x)
4. Cache optimization   (1.5x - 3x)
5. SIMD/Parallelism     (2x - 8x)

Common Techniques

TechniqueWhenHow
Pre-allocationKnown sizeVec::with_capacity(n)
Avoid cloningHot pathsUse references or Cow<T>
Batch operationsMany small opsCollect then process
SmallVecUsually smallsmallvec::SmallVec<[T; N]>
Inline buffersFixed-size dataArrays over Vec

Common Mistakes

MistakeWhy WrongBetter
Optimize without profilingWrong targetProfile first
Benchmark in debug modeMeaninglessAlways --release
Use LinkedListCache unfriendlyVec or VecDeque
Hidden .clone()Unnecessary allocsUse references
Premature optimizationWasted effortMake it work first

Anti-Patterns

Anti-PatternWhy BadBetter
Clone to avoid lifetimesPerformance costProper ownership
Box everythingIndirection costStack when possible
HashMap for small setsOverheadVec with linear search
String concat in loopO(n^2)String::with_capacity or format!

Related Skills

WhenSee
Reducing clonesm01-ownership
Concurrency optionsm07-concurrency
Smart pointer choicem02-resource
Domain requirementsdomain-*