Last active
November 27, 2022 12:41
-
-
Save andrewwebber/b87c678b07d88918d92a2f5aeeb9cde8 to your computer and use it in GitHub Desktop.
io performance example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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