With for_each and chain we can combine two loops into one. Occasionally this can perform faster than two loops in Rust programs.
use std::time::*;
fn increment_if_four(value: &&str, count: &mut usize) {
if value.len() == 4 {
*count += 1;
}
}
fn main() {
let values1 = [
"bird",
"",
"dog"];
let values2 = [
"red",
"blue",
"?"];
if let Ok(max) =
"100000000".parse::<usize>() {
let count1 = &mut 0;
let count2 = &mut 0;
// Version 1: use 2 for-loops.
let t0 = Instant::now();
for _ in 0..max {
for value in values1.iter() {
increment_if_four(&value, count1);
}
for value in values2.iter() {
increment_if_four(&value, count1);
}
}
println!(
"{} ms", t0.elapsed().as_millis());
// Version 2: use chain with for_each.
let t1 = Instant::now();
for _ in 0..max {
values1
.iter()
.chain(values2.iter())
.for_each(|x| increment_if_four(x, count2));
}
println!(
"{} ms", t1.elapsed().as_millis());
println!(
"{count1} = {count2}");
}
}
476 ms for, for
16 ms chain, for_each
200000000 = 200000000