diff --git a/.gitignore b/.gitignore index dfbf29b..fe6df09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target measurements.txt flamegraph.svg +perf.data diff --git a/Cargo.toml b/Cargo.toml index 7064bf4..d56df25 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "brc" version = "0.1.0" edition = "2024" +default-run = "brc" [dependencies] rand_distr = "*" diff --git a/src/main.rs b/src/main.rs index e7a11a9..aee6529 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,44 @@ +use std::{collections::HashMap, io::BufRead}; + fn main() { - println!("Hello, world!"); + let file = std::io::BufReader::new(std::fs::File::open("measurements.txt").unwrap()); + + let mut data = HashMap::new(); + + for result in file.lines() { + let line = result.unwrap(); + + let (station, value) = line.split_once(';').unwrap(); + let station = station.to_string(); + + let parsed: f64 = value.parse().unwrap(); + data.entry(station) + .and_modify(|values: &mut (f64, f64, usize, f64)| { + values.0 = values.0.min(parsed); + values.1 += parsed; + values.2 += 1; + values.3 = values.3.max(parsed); + }) + .or_insert((parsed, parsed, 1_usize, parsed)); + } + + let mut stations: Vec<_> = data.keys().collect(); + stations.sort(); + + print!("{{"); + + let mut iter = stations.into_iter().peekable(); + while let Some(s) = iter.next() { + let entry = data.get(s).unwrap(); + print!( + "{s}={:.1}/{:.1}/{:.1}", + entry.0, + entry.1 / (entry.2 as f64), + entry.3 + ); + if iter.peek().is_some() { + print!(", "); + } + } + println!("}}"); }