agy-superpowers 5.2.1 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/patches/skills-patches.md +23 -0
- package/template/agent/rules/scratch-scripts.md +37 -0
- package/template/agent/rules/superpowers.md +6 -50
- package/template/agent/skills/brainstorming/SKILL.md +4 -3
- package/template/agent/skills/brainstorming/visual-companion.md +2 -3
- package/template/agent/skills/finishing-a-development-branch/SKILL.md +11 -16
- package/template/agent/skills/subagent-driven-development/SKILL.md +16 -0
- package/template/agent/skills/subagent-driven-development/implementer-prompt.md +4 -3
- package/template/agent/skills/using-git-worktrees/SKILL.md +3 -2
- package/template/agent/skills/using-superpowers/SKILL.md +8 -6
- package/template/agent/skills/using-superpowers/references/copilot-tools.md +52 -0
- package/template/agent/skills/writing-plans/SKILL.md +5 -3
- package/template/agent/skills/writing-skills/SKILL.md +1 -1
- package/template/agent/superpowers-version.json +2 -2
- package/template/agent/tmp/agent-config-backup.yml +9 -0
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# name-type-param-single
|
|
2
|
-
|
|
3
|
-
> Use single uppercase letters for type parameters: `T`, `E`, `K`, `V`
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Generic type parameters conventionally use single uppercase letters. This keeps signatures concise and follows established conventions that readers instantly recognize. `T` for "type", `E` for "error", `K` for "key", `V` for "value" are universal in Rust.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Verbose type parameters
|
|
13
|
-
struct Container<ElementType> {
|
|
14
|
-
items: Vec<ElementType>,
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
fn process<InputType, OutputType>(input: InputType) -> OutputType { ... }
|
|
18
|
-
|
|
19
|
-
// Lowercase - looks like lifetime
|
|
20
|
-
struct Wrapper<t> { ... } // Confusing
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Good
|
|
24
|
-
|
|
25
|
-
```rust
|
|
26
|
-
// Single uppercase letters
|
|
27
|
-
struct Container<T> {
|
|
28
|
-
items: Vec<T>,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
fn process<I, O>(input: I) -> O { ... }
|
|
32
|
-
|
|
33
|
-
// Standard conventions
|
|
34
|
-
struct HashMap<K, V> { ... } // K=Key, V=Value
|
|
35
|
-
enum Result<T, E> { ... } // T=Type, E=Error
|
|
36
|
-
enum Option<T> { ... } // T=Type
|
|
37
|
-
struct Ref<'a, T> { ... } // Lifetime + Type
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Standard Type Parameter Names
|
|
41
|
-
|
|
42
|
-
| Parameter | Meaning | Example |
|
|
43
|
-
|-----------|---------|---------|
|
|
44
|
-
| `T` | Type (generic) | `Vec<T>` |
|
|
45
|
-
| `E` | Error | `Result<T, E>` |
|
|
46
|
-
| `K` | Key | `HashMap<K, V>` |
|
|
47
|
-
| `V` | Value | `HashMap<K, V>` |
|
|
48
|
-
| `I` | Input / Item | `Iterator<Item = I>` |
|
|
49
|
-
| `O` | Output | `Fn(I) -> O` |
|
|
50
|
-
| `R` | Return / Result | `fn() -> R` |
|
|
51
|
-
| `S` | State | `StateMachine<S>` |
|
|
52
|
-
| `A` | Allocator | `Vec<T, A>` |
|
|
53
|
-
| `F` | Function | `map<F>(f: F)` |
|
|
54
|
-
|
|
55
|
-
## Multiple Type Parameters
|
|
56
|
-
|
|
57
|
-
```rust
|
|
58
|
-
// Use related letters
|
|
59
|
-
fn transform<I, O, E>(input: I) -> Result<O, E>
|
|
60
|
-
where
|
|
61
|
-
I: Input,
|
|
62
|
-
O: Output,
|
|
63
|
-
E: Error,
|
|
64
|
-
{ ... }
|
|
65
|
-
|
|
66
|
-
// Or sequential: T, U, V
|
|
67
|
-
fn combine<T, U, V>(a: T, b: U) -> V { ... }
|
|
68
|
-
|
|
69
|
-
// Descriptive only when many parameters need clarity
|
|
70
|
-
struct Query<Db, Row, Err> { ... }
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Trait Bounds
|
|
74
|
-
|
|
75
|
-
```rust
|
|
76
|
-
// Keep type params short, move complexity to where clause
|
|
77
|
-
fn process<T, E>(value: T) -> Result<T, E>
|
|
78
|
-
where
|
|
79
|
-
T: Clone + Debug + Send + Sync,
|
|
80
|
-
E: Error + From<IoError>,
|
|
81
|
-
{ ... }
|
|
82
|
-
|
|
83
|
-
// Not inline
|
|
84
|
-
fn process<T: Clone + Debug + Send + Sync, E: Error + From<IoError>>(value: T) -> Result<T, E>
|
|
85
|
-
// Too long!
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## See Also
|
|
89
|
-
|
|
90
|
-
- [name-lifetime-short](./name-lifetime-short.md) - Lifetime parameter naming
|
|
91
|
-
- [name-types-camel](./name-types-camel.md) - Concrete type naming
|
|
92
|
-
- [type-generic-bounds](./type-generic-bounds.md) - Trait bounds
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# name-types-camel
|
|
2
|
-
|
|
3
|
-
> Use `UpperCamelCase` for types, traits, and enum names
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust's naming conventions are enforced by the compiler and linter. Consistent naming makes code immediately recognizable—you know `HttpClient` is a type, `send_request` is a function. Violating conventions triggers warnings and makes code harder to read.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Lowercase types - compiler warns
|
|
13
|
-
struct http_client { ... } // warning: type `http_client` should have an upper camel case name
|
|
14
|
-
trait serializable { ... } // warning
|
|
15
|
-
enum response_type { ... } // warning
|
|
16
|
-
|
|
17
|
-
// Screaming case for types
|
|
18
|
-
struct HTTP_CLIENT { ... } // Not idiomatic
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Good
|
|
22
|
-
|
|
23
|
-
```rust
|
|
24
|
-
// UpperCamelCase for all types
|
|
25
|
-
struct HttpClient { ... }
|
|
26
|
-
trait Serializable { ... }
|
|
27
|
-
enum ResponseType { ... }
|
|
28
|
-
|
|
29
|
-
// Compound words
|
|
30
|
-
struct TcpConnection { ... }
|
|
31
|
-
struct IoError { ... }
|
|
32
|
-
struct FileReader { ... }
|
|
33
|
-
|
|
34
|
-
// Generic types
|
|
35
|
-
struct HashMap<K, V> { ... }
|
|
36
|
-
struct Result<T, E> { ... }
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Acronyms
|
|
40
|
-
|
|
41
|
-
```rust
|
|
42
|
-
// Treat acronyms as words (capitalize first letter only)
|
|
43
|
-
struct HttpServer { ... } // Not HTTPServer
|
|
44
|
-
struct JsonParser { ... } // Not JSONParser
|
|
45
|
-
struct Uuid { ... } // Not UUID
|
|
46
|
-
struct TcpStream { ... } // Not TCPStream
|
|
47
|
-
|
|
48
|
-
// Exception: Two-letter acronyms can be all caps
|
|
49
|
-
struct IOError { ... } // Acceptable
|
|
50
|
-
struct IoError { ... } // Also acceptable (preferred)
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Type Aliases
|
|
54
|
-
|
|
55
|
-
```rust
|
|
56
|
-
// Type aliases also use UpperCamelCase
|
|
57
|
-
type Result<T> = std::result::Result<T, Error>;
|
|
58
|
-
type BoxedFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## See Also
|
|
62
|
-
|
|
63
|
-
- [name-variants-camel](./name-variants-camel.md) - Enum variant naming
|
|
64
|
-
- [name-funcs-snake](./name-funcs-snake.md) - Function naming
|
|
65
|
-
- [name-acronym-word](./name-acronym-word.md) - Acronym handling
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# name-variants-camel
|
|
2
|
-
|
|
3
|
-
> Use `UpperCamelCase` for enum variants
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Enum variants follow the same naming convention as types—`UpperCamelCase`. This distinguishes them from fields, variables, and functions. The compiler warns on violations, and consistent naming helps readers instantly recognize variant names.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
enum Status {
|
|
13
|
-
pending, // warning: variant `pending` should have an upper camel case name
|
|
14
|
-
in_progress, // warning
|
|
15
|
-
COMPLETED, // Not idiomatic
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
enum Color {
|
|
19
|
-
RED, // Screaming case - not Rust style
|
|
20
|
-
GREEN,
|
|
21
|
-
BLUE,
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Good
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
enum Status {
|
|
29
|
-
Pending,
|
|
30
|
-
InProgress,
|
|
31
|
-
Completed,
|
|
32
|
-
Failed,
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
enum Color {
|
|
36
|
-
Red,
|
|
37
|
-
Green,
|
|
38
|
-
Blue,
|
|
39
|
-
Custom(u8, u8, u8),
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
enum HttpMethod {
|
|
43
|
-
Get,
|
|
44
|
-
Post,
|
|
45
|
-
Put,
|
|
46
|
-
Delete,
|
|
47
|
-
Patch,
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Variants with Data
|
|
52
|
-
|
|
53
|
-
```rust
|
|
54
|
-
enum Message {
|
|
55
|
-
// Unit variant
|
|
56
|
-
Quit,
|
|
57
|
-
|
|
58
|
-
// Tuple variant
|
|
59
|
-
Move(i32, i32),
|
|
60
|
-
|
|
61
|
-
// Struct variant
|
|
62
|
-
Write { text: String },
|
|
63
|
-
|
|
64
|
-
// Named fields
|
|
65
|
-
ChangeColor {
|
|
66
|
-
red: u8,
|
|
67
|
-
green: u8,
|
|
68
|
-
blue: u8,
|
|
69
|
-
},
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Variant Naming Tips
|
|
74
|
-
|
|
75
|
-
```rust
|
|
76
|
-
// Be specific
|
|
77
|
-
enum Error {
|
|
78
|
-
NotFound, // Good: specific
|
|
79
|
-
PermissionDenied, // Good: specific
|
|
80
|
-
Error, // Bad: vague
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Avoid redundant type name in variant
|
|
84
|
-
enum ConnectionState {
|
|
85
|
-
Connected, // Good
|
|
86
|
-
Disconnected, // Good
|
|
87
|
-
ConnectionError, // Bad: redundant "Connection"
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Use None/Some pattern for Option-like enums
|
|
91
|
-
enum MaybeValue<T> {
|
|
92
|
-
Some(T),
|
|
93
|
-
None,
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## See Also
|
|
98
|
-
|
|
99
|
-
- [name-types-camel](./name-types-camel.md) - Type naming
|
|
100
|
-
- [api-non-exhaustive](./api-non-exhaustive.md) - Forward-compatible enums
|
|
101
|
-
- [type-enum-states](./type-enum-states.md) - State machine enums
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
# opt-bounds-check
|
|
2
|
-
|
|
3
|
-
> Use iterators and patterns that eliminate bounds checks in hot paths
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust's safety guarantees require bounds checking on array/slice indexing. In tight loops, these checks can cause measurable overhead (branch mispredictions, preventing vectorization). Patterns like iterators, `get_unchecked`, and index splitting can eliminate these checks while maintaining safety.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
fn sum_products(a: &[f64], b: &[f64]) -> f64 {
|
|
13
|
-
let mut sum = 0.0;
|
|
14
|
-
for i in 0..a.len() {
|
|
15
|
-
sum += a[i] * b[i]; // Two bounds checks per iteration
|
|
16
|
-
}
|
|
17
|
-
sum
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
fn apply_filter(data: &mut [u8], kernel: &[u8; 3]) {
|
|
21
|
-
for i in 1..data.len() - 1 {
|
|
22
|
-
// Three bounds checks per iteration
|
|
23
|
-
data[i] = (data[i - 1] + data[i] + data[i + 1]) / 3;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Good
|
|
29
|
-
|
|
30
|
-
```rust
|
|
31
|
-
fn sum_products(a: &[f64], b: &[f64]) -> f64 {
|
|
32
|
-
// Iterator zips - no bounds checks, vectorizes well
|
|
33
|
-
a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
fn apply_filter(data: &mut [u8]) {
|
|
37
|
-
// Windows pattern - no bounds checks
|
|
38
|
-
for window in data.windows(3) {
|
|
39
|
-
// window[0], window[1], window[2] are all valid
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Or use chunks
|
|
43
|
-
for chunk in data.chunks_exact(4) {
|
|
44
|
-
process_simd(chunk);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Iterator Patterns
|
|
50
|
-
|
|
51
|
-
```rust
|
|
52
|
-
// All of these avoid bounds checks:
|
|
53
|
-
|
|
54
|
-
// zip - parallel iteration
|
|
55
|
-
for (a, b) in xs.iter().zip(ys.iter()) { ... }
|
|
56
|
-
|
|
57
|
-
// enumerate - index + value
|
|
58
|
-
for (i, x) in data.iter().enumerate() { ... }
|
|
59
|
-
|
|
60
|
-
// windows - sliding window
|
|
61
|
-
for window in data.windows(3) { ... }
|
|
62
|
-
|
|
63
|
-
// chunks - fixed-size groups
|
|
64
|
-
for chunk in data.chunks(4) { ... }
|
|
65
|
-
for chunk in data.chunks_exact(4) { ... } // Guarantees exact size
|
|
66
|
-
|
|
67
|
-
// split_at - divide slice
|
|
68
|
-
let (left, right) = data.split_at(mid);
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Split for Parallel Access
|
|
72
|
-
|
|
73
|
-
```rust
|
|
74
|
-
fn parallel_sum(data: &[i32]) -> i32 {
|
|
75
|
-
// Split into independent chunks
|
|
76
|
-
let (left, right) = data.split_at(data.len() / 2);
|
|
77
|
-
|
|
78
|
-
// Process chunks without bounds checks
|
|
79
|
-
let sum_left: i32 = left.iter().sum();
|
|
80
|
-
let sum_right: i32 = right.iter().sum();
|
|
81
|
-
|
|
82
|
-
sum_left + sum_right
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## get_unchecked for Proven Safety
|
|
87
|
-
|
|
88
|
-
```rust
|
|
89
|
-
fn matrix_multiply(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
|
|
90
|
-
assert!(a.len() >= n * n);
|
|
91
|
-
assert!(b.len() >= n * n);
|
|
92
|
-
assert!(c.len() >= n * n);
|
|
93
|
-
|
|
94
|
-
for i in 0..n {
|
|
95
|
-
for j in 0..n {
|
|
96
|
-
let mut sum = 0.0;
|
|
97
|
-
for k in 0..n {
|
|
98
|
-
// SAFETY: bounds verified by asserts above
|
|
99
|
-
unsafe {
|
|
100
|
-
sum += a.get_unchecked(i * n + k)
|
|
101
|
-
* b.get_unchecked(k * n + j);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// SAFETY: bounds verified by asserts above
|
|
105
|
-
unsafe {
|
|
106
|
-
*c.get_unchecked_mut(i * n + j) = sum;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Slice Patterns
|
|
114
|
-
|
|
115
|
-
```rust
|
|
116
|
-
fn process_header(data: &[u8]) -> Option<Header> {
|
|
117
|
-
// Slice pattern - single length check, no per-field checks
|
|
118
|
-
let [a, b, c, d, rest @ ..] = data else {
|
|
119
|
-
return None;
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
Some(Header {
|
|
123
|
-
magic: *a,
|
|
124
|
-
version: *b,
|
|
125
|
-
flags: u16::from_le_bytes([*c, *d]),
|
|
126
|
-
payload: rest,
|
|
127
|
-
})
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Verify Bounds Check Elimination
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
# Check generated assembly
|
|
135
|
-
cargo asm --release my_crate::hot_function
|
|
136
|
-
|
|
137
|
-
# Look for 'cmp' and 'ja'/'jbe' instructions near array access
|
|
138
|
-
# If eliminated, you'll see direct memory access
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## When to Accept Bounds Checks
|
|
142
|
-
|
|
143
|
-
```rust
|
|
144
|
-
// Random access patterns - checks unavoidable
|
|
145
|
-
fn random_lookup(data: &[u8], indices: &[usize]) -> Vec<u8> {
|
|
146
|
-
indices.iter()
|
|
147
|
-
.filter_map(|&i| data.get(i).copied()) // Checked, but necessary
|
|
148
|
-
.collect()
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Infrequent access - overhead negligible
|
|
152
|
-
fn get_config(&self, key: &str) -> Option<&Value> {
|
|
153
|
-
self.config.get(key) // Fine, not hot path
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## See Also
|
|
158
|
-
|
|
159
|
-
- [opt-simd-portable](./opt-simd-portable.md) - SIMD requires unchecked access
|
|
160
|
-
- [opt-cache-friendly](./opt-cache-friendly.md) - Cache-efficient patterns
|
|
161
|
-
- [perf-profile-first](./perf-profile-first.md) - Identify actual hot paths
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
# opt-cache-friendly
|
|
2
|
-
|
|
3
|
-
> Organize data for cache-efficient access patterns
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Cache misses are expensive—a L3 cache miss costs ~100+ cycles vs ~4 cycles for L1 hit. Data layout and access patterns determine cache efficiency. Arrays of structs (AoS) vs structs of arrays (SoA), memory locality, and access patterns can make order-of-magnitude performance differences.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Array of Structs (AoS) - poor cache use when accessing one field
|
|
13
|
-
struct Particle {
|
|
14
|
-
position: [f32; 3], // 12 bytes
|
|
15
|
-
velocity: [f32; 3], // 12 bytes
|
|
16
|
-
mass: f32, // 4 bytes
|
|
17
|
-
id: u64, // 8 bytes
|
|
18
|
-
flags: u8, // 1 byte + padding
|
|
19
|
-
// Total: 40 bytes per particle
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
fn update_positions(particles: &mut [Particle], dt: f32) {
|
|
23
|
-
for p in particles {
|
|
24
|
-
// Access position and velocity - 24 bytes
|
|
25
|
-
// But loads 40-byte struct per particle
|
|
26
|
-
// 16 bytes wasted per cache line load
|
|
27
|
-
p.position[0] += p.velocity[0] * dt;
|
|
28
|
-
p.position[1] += p.velocity[1] * dt;
|
|
29
|
-
p.position[2] += p.velocity[2] * dt;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Good
|
|
35
|
-
|
|
36
|
-
```rust
|
|
37
|
-
// Struct of Arrays (SoA) - cache-efficient for field access
|
|
38
|
-
struct Particles {
|
|
39
|
-
positions_x: Vec<f32>,
|
|
40
|
-
positions_y: Vec<f32>,
|
|
41
|
-
positions_z: Vec<f32>,
|
|
42
|
-
velocities_x: Vec<f32>,
|
|
43
|
-
velocities_y: Vec<f32>,
|
|
44
|
-
velocities_z: Vec<f32>,
|
|
45
|
-
masses: Vec<f32>,
|
|
46
|
-
ids: Vec<u64>,
|
|
47
|
-
flags: Vec<u8>,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
fn update_positions(p: &mut Particles, dt: f32) {
|
|
51
|
-
// Access contiguous memory - perfect cache utilization
|
|
52
|
-
for (px, vx) in p.positions_x.iter_mut().zip(&p.velocities_x) {
|
|
53
|
-
*px += vx * dt;
|
|
54
|
-
}
|
|
55
|
-
for (py, vy) in p.positions_y.iter_mut().zip(&p.velocities_y) {
|
|
56
|
-
*py += vy * dt;
|
|
57
|
-
}
|
|
58
|
-
for (pz, vz) in p.positions_z.iter_mut().zip(&p.velocities_z) {
|
|
59
|
-
*pz += vz * dt;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Hot/Cold Splitting
|
|
65
|
-
|
|
66
|
-
```rust
|
|
67
|
-
// Separate frequently and rarely accessed fields
|
|
68
|
-
struct EntityHot {
|
|
69
|
-
position: [f32; 3],
|
|
70
|
-
velocity: [f32; 3],
|
|
71
|
-
// Hot data - accessed every frame
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
struct EntityCold {
|
|
75
|
-
name: String,
|
|
76
|
-
creation_time: Instant,
|
|
77
|
-
metadata: HashMap<String, Value>,
|
|
78
|
-
// Cold data - rarely accessed
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
struct Entities {
|
|
82
|
-
hot: Vec<EntityHot>,
|
|
83
|
-
cold: Vec<EntityCold>,
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Hot loop touches only hot data
|
|
87
|
-
fn update(entities: &mut Entities, dt: f32) {
|
|
88
|
-
for e in &mut entities.hot {
|
|
89
|
-
e.position[0] += e.velocity[0] * dt;
|
|
90
|
-
// Cold data stays out of cache
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Prefetching
|
|
96
|
-
|
|
97
|
-
```rust
|
|
98
|
-
// Process in cache-line-sized chunks
|
|
99
|
-
const CACHE_LINE: usize = 64;
|
|
100
|
-
|
|
101
|
-
fn process_with_prefetch(data: &mut [u8]) {
|
|
102
|
-
for chunk in data.chunks_mut(CACHE_LINE) {
|
|
103
|
-
// Prefetch next chunk while processing current
|
|
104
|
-
// (automatic in many cases, manual for complex patterns)
|
|
105
|
-
process_chunk(chunk);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Matrix multiplication - block for cache
|
|
110
|
-
fn matmul_blocked(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
|
|
111
|
-
const BLOCK: usize = 32; // Fits in L1 cache
|
|
112
|
-
|
|
113
|
-
for i0 in (0..n).step_by(BLOCK) {
|
|
114
|
-
for j0 in (0..n).step_by(BLOCK) {
|
|
115
|
-
for k0 in (0..n).step_by(BLOCK) {
|
|
116
|
-
// Process BLOCK x BLOCK tile
|
|
117
|
-
for i in i0..min(i0 + BLOCK, n) {
|
|
118
|
-
for j in j0..min(j0 + BLOCK, n) {
|
|
119
|
-
// Inner loop operates on cached data
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Avoid Pointer Chasing
|
|
129
|
-
|
|
130
|
-
```rust
|
|
131
|
-
// Bad: linked list - random memory access
|
|
132
|
-
struct Node {
|
|
133
|
-
value: i32,
|
|
134
|
-
next: Option<Box<Node>>,
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
fn sum_linked(head: &Node) -> i32 {
|
|
138
|
-
// Each node is a cache miss
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Good: contiguous vector
|
|
142
|
-
fn sum_vector(data: &[i32]) -> i32 {
|
|
143
|
-
data.iter().sum() // Sequential access, prefetcher happy
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Good: if graph needed, use indices
|
|
147
|
-
struct Graph {
|
|
148
|
-
values: Vec<i32>,
|
|
149
|
-
edges: Vec<usize>, // Indices into values
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Memory Layout Attributes
|
|
154
|
-
|
|
155
|
-
```rust
|
|
156
|
-
// Ensure cache-line alignment
|
|
157
|
-
#[repr(C, align(64))]
|
|
158
|
-
struct CacheAligned {
|
|
159
|
-
data: [u8; 64],
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Prevent false sharing in concurrent code
|
|
163
|
-
#[repr(C, align(64))]
|
|
164
|
-
struct PaddedCounter {
|
|
165
|
-
value: AtomicU64,
|
|
166
|
-
_pad: [u8; 56],
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## Measuring Cache Performance
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
# Linux perf
|
|
174
|
-
perf stat -e cache-references,cache-misses ./my_program
|
|
175
|
-
|
|
176
|
-
# Detailed cache analysis
|
|
177
|
-
perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./my_program
|
|
178
|
-
|
|
179
|
-
# Cachegrind
|
|
180
|
-
valgrind --tool=cachegrind ./my_program
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## See Also
|
|
184
|
-
|
|
185
|
-
- [mem-smaller-integers](./mem-smaller-integers.md) - Smaller data fits more in cache
|
|
186
|
-
- [mem-box-large-variant](./mem-box-large-variant.md) - Keep enum sizes small
|
|
187
|
-
- [opt-bounds-check](./opt-bounds-check.md) - Sequential access patterns
|