|
|
Auto-vectorisation and why floating-point addition blocks it
|
Hard
|
End-to-End
|
|
|
|
Bounds checks: when they cost, and five safe ways to remove them
|
Hard
|
End-to-End
|
|
|
|
Capacity and pre-sizing, graded
|
Easy
|
Primitives
|
|
|
|
Case-insensitive search without allocating
|
Easy
|
Primitives
|
|
|
|
Chains versus loops: top-k, and a function that must not allocate
|
Medium
|
End-to-End
|
|
|
|
const fn and compile-time evaluation
|
Hard
|
End-to-End
|
|
|
|
Const generics: moving a size from runtime to compile time
|
Hard
|
End-to-End
|
|
|
|
Custom hashing: beating SipHash on integer keys
|
Hard
|
End-to-End
|
|
|
|
Enum dispatch: the third option
|
Medium
|
End-to-End
|
|
|
|
#[inline], #[inline(always)], #[cold] and the codegen-unit trap
|
Hard
|
End-to-End
|
|
|
|
In-place mutation vs rebuild, measured
|
Easy
|
Primitives
|
|
|
|
Iterator performance: where the abstraction leaks
|
Medium
|
End-to-End
|
|
|
|
`large_enum_variant`: boxing the fat variant
|
Medium
|
Primitives
|
|
|
|
Memory layout and cache behaviour: flat arrays, AoS vs SoA
|
Medium
|
End-to-End
|
|
|
|
Needless clone: the most common review comment in Rust
|
Medium
|
End-to-End
|
|
|
|
Reusing buffers instead of allocating per iteration
|
Medium
|
Primitives
|
|
|
|
size_hint and DoubleEndedIterator: an iterator with two ends
|
Hard
|
Primitives
|
|
|
|
Sorting: sort vs sort_unstable vs sort_by_cached_key
|
Medium
|
End-to-End
|
|
|
|
Static vs dynamic dispatch, measured
|
Hard
|
End-to-End
|
|
|
|
String and text performance, graded
|
Medium
|
End-to-End
|
|
|
|
String building: push_str, write!, and the 590x cliff
|
Easy
|
Primitives
|
|
|
|
Type sizes, enum layout and niche optimisation
|
Medium
|
Primitives
|
|
|
|
Where the allocations are: the counting allocator
|
Easy
|
Primitives
|
|