Improve performance of Candidate in HashMap by simplifying equality check

This commit is contained in:
RunasSudo 2022-08-20 23:39:15 +10:00
parent 422a198cf5
commit 974a56dffd
Signed by: RunasSudo
GPG Key ID: 7234E476BF21C61A
2 changed files with 11 additions and 2 deletions

View File

@ -775,6 +775,7 @@ pub fn init_repeat_count<N: Number>(election: &mut Election<N>) {
let mut new_candidates = Vec::new(); let mut new_candidates = Vec::new();
for candidate in &election.candidates { for candidate in &election.candidates {
let mut new_candidate = candidate.clone(); let mut new_candidate = candidate.clone();
new_candidate.index += election.candidates.len(); // Ensure unique index
new_candidate.is_dummy = true; new_candidate.is_dummy = true;
new_candidates.push(new_candidate); new_candidates.push(new_candidate);
} }

View File

@ -100,7 +100,7 @@ impl<N: Number> Election<N> {
} }
/// A candidate in an [Election] /// A candidate in an [Election]
#[derive(Clone, Eq, PartialEq)] #[derive(Clone, Eq)]
#[cfg_attr(not(target_arch = "wasm32"), derive(Archive, Deserialize, Serialize))] #[cfg_attr(not(target_arch = "wasm32"), derive(Archive, Deserialize, Serialize))]
pub struct Candidate { pub struct Candidate {
/// Index of the candidate /// Index of the candidate
@ -111,13 +111,21 @@ pub struct Candidate {
pub is_dummy: bool, pub is_dummy: bool,
} }
impl PartialEq for Candidate {
// Custom implementation of eq for HashMap purposes, to improve performance
//
// SAFETY: Results in undefined behaviour if multiple Candidates are allowed to have the same index
fn eq(&self, other: &Candidate) -> bool {
return self.index == other.index;
}
}
impl Hash for Candidate { impl Hash for Candidate {
fn hash<H: Hasher>(&self, hasher: &mut H) { fn hash<H: Hasher>(&self, hasher: &mut H) {
// Custom implementation of hash for use with NoHashHasher, to improve performance // Custom implementation of hash for use with NoHashHasher, to improve performance
hasher.write_usize(self.index); hasher.write_usize(self.index);
} }
} }
impl nohash_hasher::IsEnabled for Candidate {} impl nohash_hasher::IsEnabled for Candidate {}
/// The current state of counting an [Election] /// The current state of counting an [Election]