Skip to content

Commit acda9d1

Browse files
committed
BTreeMap/BTreeSet drain & retain and share the now 7 similar algorithms
1 parent 4007d4e commit acda9d1

File tree

9 files changed

+620
-187
lines changed

9 files changed

+620
-187
lines changed

src/liballoc/benches/btree/map.rs

+30
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,36 @@ pub fn iter_100000(b: &mut Bencher) {
146146
bench_iter(b, 100000);
147147
}
148148

149+
fn bench_iter_mut(b: &mut Bencher, size: i32) {
150+
let mut map = BTreeMap::<i32, i32>::new();
151+
let mut rng = thread_rng();
152+
153+
for _ in 0..size {
154+
map.insert(rng.gen(), rng.gen());
155+
}
156+
157+
b.iter(|| {
158+
for kv in map.iter_mut() {
159+
black_box(kv);
160+
}
161+
});
162+
}
163+
164+
#[bench]
165+
pub fn iter_mut_20(b: &mut Bencher) {
166+
bench_iter_mut(b, 20);
167+
}
168+
169+
#[bench]
170+
pub fn iter_mut_1000(b: &mut Bencher) {
171+
bench_iter_mut(b, 1000);
172+
}
173+
174+
#[bench]
175+
pub fn iter_mut_100000(b: &mut Bencher) {
176+
bench_iter_mut(b, 100000);
177+
}
178+
149179
fn bench_first_and_last(b: &mut Bencher, size: i32) {
150180
let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
151181
b.iter(|| {

src/liballoc/benches/btree/set.rs

+50-8
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,13 @@ fn random(n: usize) -> BTreeSet<usize> {
1414
}
1515

1616
fn neg(n: usize) -> BTreeSet<i32> {
17-
let mut set = BTreeSet::new();
18-
for i in -(n as i32)..=-1 {
19-
set.insert(i);
20-
}
17+
let set: BTreeSet<i32> = (-(n as i32)..=-1).collect();
2118
assert_eq!(set.len(), n);
2219
set
2320
}
2421

2522
fn pos(n: usize) -> BTreeSet<i32> {
26-
let mut set = BTreeSet::new();
27-
for i in 1..=(n as i32) {
28-
set.insert(i);
29-
}
23+
let set: BTreeSet<i32> = (1..=(n as i32)).collect();
3024
assert_eq!(set.len(), n);
3125
set
3226
}
@@ -56,6 +50,54 @@ macro_rules! set_bench {
5650
};
5751
}
5852

53+
const BUILD_SET_SIZE: usize = 100;
54+
55+
#[bench]
56+
pub fn build_and_clear(b: &mut Bencher) {
57+
b.iter(|| pos(BUILD_SET_SIZE).clear())
58+
}
59+
60+
#[bench]
61+
pub fn build_and_drain(b: &mut Bencher) {
62+
b.iter(|| pos(BUILD_SET_SIZE).drain().count())
63+
}
64+
65+
#[bench]
66+
pub fn build_and_drop(b: &mut Bencher) {
67+
b.iter(|| pos(BUILD_SET_SIZE))
68+
}
69+
70+
#[bench]
71+
pub fn build_and_into_iter(b: &mut Bencher) {
72+
b.iter(|| pos(BUILD_SET_SIZE).into_iter().count())
73+
}
74+
75+
#[bench]
76+
pub fn build_and_pop_all(b: &mut Bencher) {
77+
b.iter(|| {
78+
let mut s = pos(BUILD_SET_SIZE);
79+
while s.pop_first().is_some() {
80+
}
81+
s
82+
});
83+
}
84+
85+
#[bench]
86+
pub fn build_and_remove_all(b: &mut Bencher) {
87+
b.iter(|| {
88+
let mut s = pos(BUILD_SET_SIZE);
89+
while let Some(elt) = s.iter().copied().next() {
90+
s.remove(&elt);
91+
}
92+
s
93+
});
94+
}
95+
96+
#[bench]
97+
pub fn build_and_retain_nothing(b: &mut Bencher) {
98+
b.iter(|| pos(BUILD_SET_SIZE).retain(|_| false))
99+
}
100+
59101
set_bench! {intersection_100_neg_vs_100_pos, intersection, count, [neg(100), pos(100)]}
60102
set_bench! {intersection_100_neg_vs_10k_pos, intersection, count, [neg(100), pos(10_000)]}
61103
set_bench! {intersection_100_pos_vs_100_neg, intersection, count, [pos(100), neg(100)]}

src/liballoc/benches/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#![feature(btree_drain_retain)]
12
#![feature(map_first_last)]
23
#![feature(repr_simd)]
34
#![feature(test)]

0 commit comments

Comments
 (0)