From aaa11c7b94dd581d3508d075e1e19f6214ab9cf2 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Wed, 28 Aug 2024 14:07:16 +0200 Subject: [PATCH] Worse than fx (despite me hashing the station names there too) better than vanilla --- .../src/implementations/multi_threaded.rs | 11 ++++--- src/main/rust/src/models.rs | 1 + src/main/rust/src/models/hasher.rs | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/main/rust/src/models/hasher.rs diff --git a/src/main/rust/src/implementations/multi_threaded.rs b/src/main/rust/src/implementations/multi_threaded.rs index 78ea9d8..7e54ec3 100644 --- a/src/main/rust/src/implementations/multi_threaded.rs +++ b/src/main/rust/src/implementations/multi_threaded.rs @@ -1,3 +1,4 @@ +use crate::models::hasher::CustomBuildHasher; use crate::models::station_measurements::StationMeasurements; use crate::utils::{hash, parse}; use std::collections::HashMap; @@ -12,8 +13,9 @@ pub fn run() { const FILE_PATH: &str = "../../../measurements.txt"; let now = Instant::now(); thread::scope(|s| { - let mut stations: HashMap = - HashMap::with_capacity(DEFAULT_HASHMAP_LENGTH); + let hasher = CustomBuildHasher::default(); + let mut stations: HashMap = + HashMap::with_capacity_and_hasher(DEFAULT_HASHMAP_LENGTH, hasher); let (tx, rx) = mpsc::channel(); let cores = thread::available_parallelism().unwrap().into(); let file = File::open(FILE_PATH).expect("File measurements.txt not found"); @@ -44,8 +46,9 @@ pub fn run() { let file = File::open(FILE_PATH).expect("File measurements.txt not found"); let mut reader = BufReader::new(&file); reader.seek(SeekFrom::Start(currposition)).unwrap(); - let mut t_stations: HashMap = - HashMap::with_capacity(DEFAULT_HASHMAP_LENGTH); + let hasher = CustomBuildHasher::default(); + let mut t_stations: HashMap = + HashMap::with_capacity_and_hasher(DEFAULT_HASHMAP_LENGTH, hasher); let mut line = Vec::with_capacity(108); loop { let line_len = reader diff --git a/src/main/rust/src/models.rs b/src/main/rust/src/models.rs index 70e563a..de1f3e6 100644 --- a/src/main/rust/src/models.rs +++ b/src/main/rust/src/models.rs @@ -1,2 +1,3 @@ pub mod mmap; pub mod station_measurements; +pub mod hasher; diff --git a/src/main/rust/src/models/hasher.rs b/src/main/rust/src/models/hasher.rs new file mode 100644 index 0000000..346dbfd --- /dev/null +++ b/src/main/rust/src/models/hasher.rs @@ -0,0 +1,33 @@ +use std::hash::{BuildHasherDefault, Hasher}; +use crate::utils::hash; + +#[derive(Copy, Clone)] +pub struct CustomHasher(u64); + +impl Default for CustomHasher { + #[inline] + fn default() -> Self { + CustomHasher(0) + } +} + +impl CustomHasher { + #[inline] + pub fn with_key(key: u64) -> CustomHasher { + CustomHasher(key) + } +} + +impl Hasher for CustomHasher { + #[inline] + fn finish(&self) -> u64 { + self.0 + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + *self = CustomHasher(hash::bytes(bytes)); + } +} + +pub type CustomBuildHasher = BuildHasherDefault; \ No newline at end of file