From 232d76ef3629b5ae7ebfceef303c683e503ddbdd Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Mon, 8 Jan 2018 21:39:54 +0100 Subject: [PATCH] Implement some traits for rayon support. --- Cargo.toml | 7 +++++++ benches/bench.rs | 33 +++++++++++++++++++++++++++++++++ src/lib.rs | 39 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 benches/bench.rs diff --git a/Cargo.toml b/Cargo.toml index ce6fec9..ca4f5da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,11 +4,18 @@ version = "0.1.0" authors = ["logaritmisk "] [dependencies] +rayon = "0.9" serde = "1.0" unreachable = "1.0" [dev-dependencies] +criterion = { git = "https://github.com/japaric/criterion.rs.git" } +rand = "0.4" serde_test = "1.0" +[[bench]] +name = "bench" +harness = false + [profile.release] lto = true diff --git a/benches/bench.rs b/benches/bench.rs new file mode 100644 index 0000000..1d70994 --- /dev/null +++ b/benches/bench.rs @@ -0,0 +1,33 @@ +#[macro_use] +extern crate criterion; +extern crate rand; + +extern crate bit_set; + +use std::iter::FromIterator; + +use criterion::Criterion; +use rand::{Rng, SeedableRng, XorShiftRng}; + +use bit_set::BitSet; + +fn default_set>(n: usize) -> C { + let mut rng = XorShiftRng::from_seed([0, 1, 2, 3]); + + (0..n).map(|_| rng.next_u64()).collect() +} + +fn criterion_benchmark(c: &mut Criterion) { + let data: Vec<_> = default_set(1000); + + c.bench_function("insert", |b| b.iter(|| { + let mut set = BitSet::new(); + + for v in &data { + set.insert(*v); + } + })); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/src/lib.rs b/src/lib.rs index 0374581..c243733 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +extern crate rayon; extern crate serde; extern crate unreachable; @@ -5,7 +6,9 @@ use std::fmt; use std::ops; use std::iter::{FromIterator, IntoIterator, Iterator}; use std::default::Default; -use std::collections::HashMap; +use std::collections::{HashMap, LinkedList}; + +use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::ser::SerializeSeq; @@ -330,6 +333,40 @@ impl Iterator for IntoIter { } } +impl ParallelExtend for BitSet { + fn par_extend(&mut self, par_iter: I) + where I: + IntoParallelIterator + { + let list = par_iter + .into_par_iter() + .fold(Vec::new, |mut vec, elem| { + vec.push(elem); + vec + }) + .collect::>>(); + + let len = list.iter().map(Vec::len).sum(); + + let mut set = BitSet::with_capacity(len); + + for vec in list { + set.extend(vec); + } + } +} + +impl FromParallelIterator for BitSet { + fn from_par_iter(par_iter: I) -> Self + where + I: IntoParallelIterator + { + let mut set = BitSet::new(); + set.par_extend(par_iter); + set + } +} + impl Serialize for BitSet { #[inline] fn serialize(&self, serializer: S) -> Result