Performance Patterns
Hash Map Lookup
Cache Values by Key
A hash map stores values by key so repeated lookups do not need a linear scan.
Program
Play the program to choose a user id and see the cached credit value returned.
hash_map_lookup.rs
Replay: real traced execution (multi-file project)
use std::collections::HashMap;
fn main() {
let user_id = 2;
let mut credits = HashMap::new();
credits.insert(1, 10);
credits.insert(2, 25);
let total = lookup_credit(&credits, user_id);
println!("user {user_id}: {total}");
}
fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {
credits.get(&user_id).copied().unwrap_or(0)
}
use std::collections::HashMap;
fn main() {
let user_id = 1;
let mut credits = HashMap::new();
credits.insert(1, 10);
credits.insert(2, 25);
let total = lookup_credit(&credits, user_id);
println!("user {user_id}: {total}");
}
fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {
credits.get(&user_id).copied().unwrap_or(0)
}
use std::collections::HashMap;
fn main() {
let user_id = 3;
let mut credits = HashMap::new();
credits.insert(1, 10);
credits.insert(2, 25);
let total = lookup_credit(&credits, user_id);
println!("user {user_id}: {total}");
}
fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {
credits.get(&user_id).copied().unwrap_or(0)
}
user_id ← 2, credits ← {}
3fn main() {4 let user_i→ 2d = 2; //@user_id=2, 1, 35 let mut credit→ {}s = HashMap::new();6 credits.insert(1, 10);7 credits.insert(2, 25);8 let total = lookup_credit(&credit{1: 10, 2: 25}s, user_i2d);9 println!("user {user_id}: {total}");fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32
12fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {13 credits.get(&user_i2d).copied().unwrap_or(0)14}total ← 25
7 credits.insert(2, 25);8 let tota→ 25l = lookup_credit(&credit{1: 10, 2: 25}s, user_i2d);9 println!("user {user_id}: {total}");10}outputuser 2: 25
user_id ← 1, credits ← {}
3fn main() {4 let user_i→ 1d = 1;5 let mut credit→ {}s = HashMap::new();6 credits.insert(1, 10);7 credits.insert(2, 25);8 let total = lookup_credit(&credit{2: 25, 1: 10}s, user_i1d);9 println!("user {user_id}: {total}");fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32
12fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {13 credits.get(&user_i1d).copied().unwrap_or(0)14}total ← 10
7 credits.insert(2, 25);8 let tota→ 10l = lookup_credit(&credit{2: 25, 1: 10}s, user_i1d);9 println!("user {user_id}: {total}");10}outputuser 1: 10
user_id ← 3, credits ← {}
3fn main() {4 let user_i→ 3d = 3;5 let mut credit→ {}s = HashMap::new();6 credits.insert(1, 10);7 credits.insert(2, 25);8 let total = lookup_credit(&credit{2: 25, 1: 10}s, user_i3d);9 println!("user {user_id}: {total}");fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32
12fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {13 credits.get(&user_i3d).copied().unwrap_or(0)14}total ← 0
7 credits.insert(2, 25);8 let tota→ 0l = lookup_credit(&credit{2: 25, 1: 10}s, user_i3d);9 println!("user {user_id}: {total}");10}outputuser 3: 0
hash map
`HashMap` stores values under keys for direct lookup.
copied
`copied()` turns an `Option<&i32>` into an `Option<i32>` for this small value type.
fallback
`unwrap_or(0)` supplies a default when a key is not cached.