Skip to content

Instantly share code, notes, and snippets.

@andrewwebber
Last active November 27, 2022 12:41
Show Gist options
  • Save andrewwebber/b87c678b07d88918d92a2f5aeeb9cde8 to your computer and use it in GitHub Desktop.
Save andrewwebber/b87c678b07d88918d92a2f5aeeb9cde8 to your computer and use it in GitHub Desktop.
io performance example
use std::{
collections::{BTreeMap, HashMap},
error::Error,
io::{self, Read},
};
use time::Instant;
fn main() -> Result<(), Box<dyn Error>> {
let o_start = Instant::now();
let r_start = Instant::now();
let mut buffer = String::new();
let _ = io::stdin().read_to_string(&mut buffer)?;
let r_read = r_start.elapsed();
let p_start = Instant::now();
let buffer = buffer.to_lowercase();
let mut words = HashMap::<&str, usize>::new();
for word in buffer.split_whitespace() {
match words.get_mut(word) {
Some(count) => {
*count = *count + 1;
}
None => {
words.insert(word, 1);
}
}
}
let p_read = p_start.elapsed();
let s_start = Instant::now();
let mut sorted_words: Vec<_> = words
.iter()
.map(|(k, v)| CountedWord { word: k, count: &v })
.collect();
sorted_words.sort_by(|f1, f2| f2.count.cmp(f1.count));
let s_read = s_start.elapsed();
let w_start = Instant::now();
for CountedWord { word, count } in sorted_words {
println!("{word}{count}");
}
let w_read = w_start.elapsed();
let o_read = o_start.elapsed();
eprintln!("Reading: {}", r_read.as_seconds_f64());
eprintln!("Processing: {}", p_read.as_seconds_f64());
eprintln!("Sorting: {}", s_read.as_seconds_f64());
eprintln!("Outputting: {}", w_read.as_seconds_f64());
eprintln!("Overall: {}", o_read.as_seconds_f64());
Ok(())
}
struct CountedWord<'a> {
word: &'a str,
count: &'a usize,
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment