Consider this Rust program. It creates an vector of 10000 elements, and then assigns a value somewhere in the middle of the vector.
fn main() {
// Vector for testing.
let mut x = vec![];
for _ in 0..10000 {
x.push(0);
}
x[5555] = 5;
// Version 1: use checked slice accesses.
let t = Instant::now();
let mut count = 0;
for _ in 0..100000 {
for j in 10..9900 {
if x[j] == 5 {
count += 1;
}
}
}
println!(
"{}", t.elapsed().as_millis());
// Version 2: use get_unchecked.
let t = Instant::now();
for _ in 0..100000 {
for j in 10..9900 {
unsafe {
if *x.get_unchecked(j) == 5 {
count += 1;
}
}
}
}
println!(
"{}", t.elapsed().as_millis());
println!(
"{}", count);
}
468 ms x[j]
314 ms *x.get_unchecked(j)
200000