Use hashbrown. Everything was faster, except contains. Not that great that it was contains that was slower, but I think it will be worth it.

This commit is contained in:
2018-11-02 08:27:50 +01:00
parent 1da5bab61e
commit 9cc23745cf
3 changed files with 7 additions and 43 deletions

View File

@@ -4,7 +4,7 @@ version = "0.1.0"
authors = ["logaritmisk <anders.e.olsson@gmail.com>"] authors = ["logaritmisk <anders.e.olsson@gmail.com>"]
[dependencies] [dependencies]
ordermap = "0.4" hashbrown = "0.1"
rayon = "1.0" rayon = "1.0"
serde = "1.0" serde = "1.0"
unreachable = "1.0" unreachable = "1.0"

View File

@@ -1,32 +0,0 @@
use std::default::Default;
use std::hash::{BuildHasherDefault, Hasher};
use unreachable;
pub struct BitHasher(u64);
impl Default for BitHasher {
#[inline]
fn default() -> BitHasher {
BitHasher(0)
}
}
impl Hasher for BitHasher {
#[inline]
fn finish(&self) -> u64 {
self.0
}
#[inline]
fn write(&mut self, _: &[u8]) {
unsafe { unreachable::unreachable() };
}
#[inline]
fn write_u64(&mut self, i: u64) {
*self = BitHasher(i);
}
}
pub type BitBuildHasher = BuildHasherDefault<BitHasher>;

View File

@@ -1,26 +1,22 @@
extern crate hashbrown;
extern crate rayon; extern crate rayon;
extern crate serde; extern crate serde;
extern crate unreachable; extern crate unreachable;
use std::collections::{HashMap, LinkedList}; use std::collections::LinkedList;
use std::default::Default; use std::default::Default;
use std::fmt; use std::fmt;
use std::iter::{FromIterator, IntoIterator, Iterator}; use std::iter::{FromIterator, IntoIterator, Iterator};
use std::ops; use std::ops;
use hashbrown::HashMap;
use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator};
use serde::de::{SeqAccess, Visitor}; use serde::de::{SeqAccess, Visitor};
use serde::ser::SerializeSeq; use serde::ser::SerializeSeq;
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
mod hasher;
use hasher::BitBuildHasher;
const BITS: u64 = 64; const BITS: u64 = 64;
pub type BitHashMap<V> = HashMap<u64, V, BitBuildHasher>;
#[inline] #[inline]
fn block_bit(x: u64, d: u64) -> (u64, u64) { fn block_bit(x: u64, d: u64) -> (u64, u64) {
(x / d, x % d) (x / d, x % d)
@@ -28,7 +24,7 @@ fn block_bit(x: u64, d: u64) -> (u64, u64) {
#[derive(PartialEq, Eq, Clone)] #[derive(PartialEq, Eq, Clone)]
pub struct BitSet { pub struct BitSet {
blocks: HashMap<u64, u64, BitBuildHasher>, blocks: HashMap<u64, u64>,
nbits: usize, nbits: usize,
} }
@@ -285,14 +281,14 @@ impl<'a> ops::Sub<&'a BitSet> for &'a BitSet {
} }
pub struct Iter<'a> { pub struct Iter<'a> {
iter: std::collections::hash_map::Iter<'a, u64, u64>, iter: hashbrown::hash_map::Iter<'a, u64, u64>,
block: u64, block: u64,
bits: u64, bits: u64,
bit: u64, bit: u64,
} }
pub struct IntoIter { pub struct IntoIter {
iter: std::collections::hash_map::IntoIter<u64, u64>, iter: hashbrown::hash_map::IntoIter<u64, u64>,
block: u64, block: u64,
bits: u64, bits: u64,
bit: u64, bit: u64,