Skip to content

Commit 7bd1e39

Browse files
committed
feat(*): bitsvec - a simd bitvec with rust stdlib
0 parents  commit 7bd1e39

File tree

6 files changed

+1847
-0
lines changed

6 files changed

+1847
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/target
2+
Cargo.lock

Cargo.toml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[package]
2+
name = "bitsvec"
3+
version = "0.1.0"
4+
authors = ["Chojan Shang <[email protected]>"]
5+
edition = "2021"
6+
license = "MIT / Apache-2.0"
7+
description = "A bit vector with the Rust standard library's portable SIMD API"
8+
repository = "https://github.com/psiace/bitsvec"
9+
documentation = "https://docs.rs/bitsvec"
10+
keywords = ["bitvec", "bitmap", "vec", "simd", "data-structures"]
11+
categories = ["data-structures"]
12+
readme = "README.md"
13+
14+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
15+
16+
[dependencies]
17+
smallvec = { version = "1.8", features = ["const_generics"] }
18+
19+
[features]
20+
default = ["std"]
21+
std = []
22+
23+
[dev-dependencies]
24+
criterion = "0.3"
25+
bit-vec = "0.6"
26+
bitvec = "1.0.0"
27+
28+
[[bench]]
29+
name = "comparison"
30+
harness = false

benches/comparison.rs

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
#![feature(portable_simd)]
2+
use core::simd::*;
3+
4+
use criterion::*;
5+
6+
fn benchmark_bitvector_simd(c: &mut Criterion) {
7+
let b1 = bitsvec::BitVec::ones(100_000);
8+
let b2 = bitsvec::BitVec::zeros(100_000);
9+
c.bench_function("bitsvec(this crate)", |b| {
10+
b.iter(|| {
11+
black_box(b1.and_cloned(&b2));
12+
})
13+
});
14+
}
15+
16+
fn benchmark_bitvector_simd2(c: &mut Criterion) {
17+
c.bench_function("bitsvec(this crate) with creation", |b| {
18+
b.iter(|| {
19+
let b1 = bitsvec::BitVec::ones(100_000);
20+
let b2 = bitsvec::BitVec::zeros(100_000);
21+
black_box(b1.and(b2));
22+
})
23+
});
24+
}
25+
26+
fn benchmark_bitvector_simd3(c: &mut Criterion) {
27+
c.bench_function("bitsvec(this crate) resize false", |b| {
28+
b.iter(|| {
29+
let mut b1 = bitsvec::BitVec::ones(100_000);
30+
black_box(b1.resize(200_000, false));
31+
})
32+
});
33+
}
34+
35+
fn benchmark_bitvector_simd4(c: &mut Criterion) {
36+
c.bench_function("bitsvec(this crate) resize true", |b| {
37+
b.iter(|| {
38+
let mut b1 = bitsvec::BitVec::ones(100_000);
39+
black_box(b1.resize(200_000, true));
40+
})
41+
});
42+
}
43+
44+
fn benchmark_bitvector_simd_u16x8(c: &mut Criterion) {
45+
let b1 = bitsvec::BitVecSimd::<[u16x8; 4], 8>::ones(100_000);
46+
let b2 = bitsvec::BitVecSimd::<[u16x8; 4], 8>::zeros(100_000);
47+
c.bench_function("bitsvec_u16x8(this crate)", |b| {
48+
b.iter(|| {
49+
black_box(b1.and_cloned(&b2));
50+
})
51+
});
52+
}
53+
54+
fn benchmark_bitvector_simd2_u16x8(c: &mut Criterion) {
55+
c.bench_function("bitsvec_u16x8(this crate) with creation", |b| {
56+
b.iter(|| {
57+
let b1 = bitsvec::BitVecSimd::<[u16x8; 4], 8>::ones(100_000);
58+
let b2 = bitsvec::BitVecSimd::<[u16x8; 4], 8>::zeros(100_000);
59+
black_box(b1.and(b2));
60+
})
61+
});
62+
}
63+
64+
fn benchmark_bitvector_simd3_u16x8(c: &mut Criterion) {
65+
c.bench_function("bitsvec_u16x8(this crate) resize false", |b| {
66+
b.iter(|| {
67+
let mut b1 = bitsvec::BitVecSimd::<[u16x8; 4], 8>::ones(100_000);
68+
black_box(b1.resize(200_000, false));
69+
})
70+
});
71+
}
72+
73+
fn benchmark_bitvector_simd4_u16x8(c: &mut Criterion) {
74+
c.bench_function("bitsvec_u16x8(this crate) resize true", |b| {
75+
b.iter(|| {
76+
let mut b1 = bitsvec::BitVecSimd::<[u16x8; 4], 8>::ones(100_000);
77+
black_box(b1.resize(200_000, true));
78+
})
79+
});
80+
}
81+
82+
fn benchmark_bitvector_bitvec(c: &mut Criterion) {
83+
let b1 = bit_vec::BitVec::from_elem(100_000, true);
84+
let b2 = bit_vec::BitVec::from_elem(100_000, false);
85+
c.bench_function("bit-vec 0.6", |b| {
86+
b.iter(|| {
87+
black_box(b1.clone().and(&b2));
88+
})
89+
});
90+
}
91+
92+
fn benchmark_bitvector_bitvec2(c: &mut Criterion) {
93+
c.bench_function("bit-vec 0.6 with creation", |b| {
94+
b.iter(|| {
95+
let mut b1 = bit_vec::BitVec::from_elem(100_000, true);
96+
let b2 = bit_vec::BitVec::from_elem(100_000, false);
97+
black_box(b1.and(&b2));
98+
})
99+
});
100+
}
101+
102+
fn benchmark_bitvector_bitvec_n(c: &mut Criterion) {
103+
let b1 = bitvec::bitvec![usize, bitvec::order::Msb0; 1; 100_000];
104+
let b2 = bitvec::bitvec![usize, bitvec::order::Msb0; 0; 100_000];
105+
c.bench_function("bitvec 1.0", |b| {
106+
b.iter(|| {
107+
black_box(b1.clone() & b2.clone());
108+
})
109+
});
110+
}
111+
112+
fn benchmark_bitvector_bitvec_n2(c: &mut Criterion) {
113+
c.bench_function("bitvec 1.0 with creation", |b| {
114+
b.iter(|| {
115+
let b1 = bitvec::bitvec![usize, bitvec::order::Msb0; 1; 100_000];
116+
let b2 = bitvec::bitvec![usize, bitvec::order::Msb0; 0; 100_000];
117+
black_box(b1 & b2);
118+
})
119+
});
120+
}
121+
122+
fn benchmark_bitvector_bitvec_n3(c: &mut Criterion) {
123+
c.bench_function("bitvec 1.0 resize false", |b| {
124+
b.iter(|| {
125+
let mut b1 = bitvec::bitvec![usize, bitvec::order::Msb0; 1; 100_000];
126+
black_box(b1.resize(200_000, false));
127+
})
128+
});
129+
}
130+
131+
fn benchmark_bitvector_bitvec_n4(c: &mut Criterion) {
132+
c.bench_function("bitvec 1.0 resize true", |b| {
133+
b.iter(|| {
134+
let mut b1 = bitvec::bitvec![usize, bitvec::order::Msb0; 1; 100_000];
135+
black_box(b1.resize(200_000, true));
136+
})
137+
});
138+
}
139+
140+
criterion_group!(
141+
normal_benches,
142+
benchmark_bitvector_simd,
143+
benchmark_bitvector_simd_u16x8,
144+
benchmark_bitvector_bitvec,
145+
benchmark_bitvector_bitvec_n
146+
);
147+
criterion_group!(
148+
with_creation_benches,
149+
benchmark_bitvector_simd2,
150+
benchmark_bitvector_simd2_u16x8,
151+
benchmark_bitvector_bitvec2,
152+
benchmark_bitvector_bitvec_n2
153+
);
154+
criterion_group!(
155+
resize_false_benches,
156+
benchmark_bitvector_simd3,
157+
benchmark_bitvector_simd3_u16x8,
158+
benchmark_bitvector_bitvec_n3
159+
);
160+
criterion_group!(
161+
resize_true_benches,
162+
benchmark_bitvector_simd4,
163+
benchmark_bitvector_simd4_u16x8,
164+
benchmark_bitvector_bitvec_n4
165+
);
166+
criterion_main!(
167+
normal_benches,
168+
with_creation_benches,
169+
resize_false_benches,
170+
resize_true_benches
171+
);

0 commit comments

Comments
 (0)