Performance Patterns
Borrow Slice
Read Without Copying
Borrowing a slice lets a helper read part of a collection without cloning the data.
Program
Play the program to choose how many numbers the helper reads from the borrowed slice.
borrow_slice.rs
Replay: real traced execution (multi-file project)
fn main() {
let limit = 3;
let values = [3, 4, 5, 6];
let total = sum_prefix(&values, limit);
println!("sum={total}");
}
fn sum_prefix(values: &[i32], limit: usize) -> i32 {
values[..limit].iter().sum()
}
fn main() {
let limit = 2;
let values = [3, 4, 5, 6];
let total = sum_prefix(&values, limit);
println!("sum={total}");
}
fn sum_prefix(values: &[i32], limit: usize) -> i32 {
values[..limit].iter().sum()
}
fn main() {
let limit = 4;
let values = [3, 4, 5, 6];
let total = sum_prefix(&values, limit);
println!("sum={total}");
}
fn sum_prefix(values: &[i32], limit: usize) -> i32 {
values[..limit].iter().sum()
}
limit ← 3, values ← [3, 4, 5, 6]
1fn main() {2 let limi→ 3t = 3; //@limit=3, 2, 43 let value→ [3, 4, 5, 6]s = [3, 4, 5, 6];4 let total = sum_prefix(&value[3, 4, 5, 6]s, limi3t);5 println!("sum={total}");fn sum_prefix(values: &[i32], limit: usize) -> i32
8fn sum_prefix(values: &[i32], limit: usize) -> i32 {9 values[..limit[3, 4, 5]].iter().sum()10}total ← 12
3 let values = [3, 4, 5, 6];4 let tota→ 12l = sum_prefix(&value[3, 4, 5, 6]s, limi3t);5 println!("sum={total}");6}outputsum=12
limit ← 2, values ← [3, 4, 5, 6]
1fn main() {2 let limi→ 2t = 2;3 let value→ [3, 4, 5, 6]s = [3, 4, 5, 6];4 let total = sum_prefix(&value[3, 4, 5, 6]s, limi2t);5 println!("sum={total}");fn sum_prefix(values: &[i32], limit: usize) -> i32
8fn sum_prefix(values: &[i32], limit: usize) -> i32 {9 values[..limit[3, 4]].iter().sum()10}total ← 7
3 let values = [3, 4, 5, 6];4 let tota→ 7l = sum_prefix(&value[3, 4, 5, 6]s, limi2t);5 println!("sum={total}");6}outputsum=7
limit ← 4, values ← [3, 4, 5, 6]
1fn main() {2 let limi→ 4t = 4;3 let value→ [3, 4, 5, 6]s = [3, 4, 5, 6];4 let total = sum_prefix(&value[3, 4, 5, 6]s, limi4t);5 println!("sum={total}");fn sum_prefix(values: &[i32], limit: usize) -> i32
8fn sum_prefix(values: &[i32], limit: usize) -> i32 {9 values[..limit[3, 4, 5, 6]].iter().sum()10}total ← 18
3 let values = [3, 4, 5, 6];4 let tota→ 18l = sum_prefix(&value[3, 4, 5, 6]s, limi4t);5 println!("sum={total}");6}outputsum=18
slice
`&values[..limit]` borrows part of the array instead of allocating another collection.
iterator
`iter().sum()` reads borrowed values and computes a result.
boundary
The helper accepts any `&[i32]`, so callers can pass arrays, vectors, or slices.