Skip to content

Commit 3ae75c5

Browse files
committed
reduce cost from .len() ; split benches; tag 0.0.17
1 parent b7075ea commit 3ae75c5

File tree

6 files changed

+348
-297
lines changed

6 files changed

+348
-297
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
[package]
33
name = "im_ternary_tree"
4-
version = "0.0.16"
4+
version = "0.0.17"
55
edition = "2021"
66
authors = ["jiyinyiyong <jiyinyiyong@gmail.com>"]
77
license = "MIT"
@@ -23,7 +23,7 @@ criterion = "0.3"
2323

2424

2525
[[bench]]
26-
name = "creating"
26+
name = "accessing"
2727
harness = false
2828

2929
[profile.release]

benches/accessing.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
3+
use im_ternary_tree::TernaryTreeList;
4+
5+
const ITER_SIZE: usize = 10000;
6+
7+
fn criterion_benchmark(c: &mut Criterion) {
8+
c.bench_function("index", |b| {
9+
let mut data = TernaryTreeList::Empty;
10+
11+
for idx in 0..ITER_SIZE {
12+
data = data.push(idx)
13+
}
14+
15+
b.iter(|| {
16+
for idx in 0..ITER_SIZE {
17+
let _ = data[idx];
18+
}
19+
})
20+
});
21+
22+
c.bench_function("get", |b| {
23+
let mut data = TernaryTreeList::Empty;
24+
25+
for idx in 0..ITER_SIZE {
26+
data = data.push(idx)
27+
}
28+
29+
b.iter(|| {
30+
for idx in 0..ITER_SIZE {
31+
let _ = data.get(idx);
32+
}
33+
})
34+
});
35+
36+
c.bench_function("loop_get", |b| {
37+
let mut data = TernaryTreeList::Empty;
38+
39+
for idx in 0..ITER_SIZE {
40+
data = data.push(idx)
41+
}
42+
43+
b.iter(|| {
44+
for idx in 0..ITER_SIZE {
45+
let _ = data.loop_get(idx);
46+
}
47+
})
48+
});
49+
50+
c.bench_function("ref_get", |b| {
51+
let mut data = TernaryTreeList::Empty;
52+
53+
for idx in 0..ITER_SIZE {
54+
data = data.push(idx)
55+
}
56+
57+
b.iter(|| {
58+
for idx in 0..ITER_SIZE {
59+
let _ = data.ref_get(idx).to_owned();
60+
}
61+
})
62+
});
63+
64+
c.bench_function("first", |b| {
65+
let mut data = TernaryTreeList::Empty;
66+
67+
for idx in 0..ITER_SIZE {
68+
data = data.push(idx)
69+
}
70+
71+
b.iter(|| {
72+
for _ in 0..ITER_SIZE {
73+
let _ = data.first();
74+
}
75+
})
76+
});
77+
}
78+
79+
criterion_group!(benches, criterion_benchmark);
80+
criterion_main!(benches);

benches/creating.rs

Lines changed: 4 additions & 252 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ use criterion::{criterion_group, criterion_main, Criterion};
22

33
use im_ternary_tree::TernaryTreeList;
44

5+
const ITER_SIZE: usize = 10000;
6+
57
fn criterion_benchmark(c: &mut Criterion) {
68
c.bench_function("creating list", |b| {
79
b.iter(|| {
810
let mut data = TernaryTreeList::Empty;
911

10-
for idx in 0..1000 {
12+
for idx in 0..ITER_SIZE {
1113
data = data.push(idx)
1214
}
1315
})
@@ -17,261 +19,11 @@ fn criterion_benchmark(c: &mut Criterion) {
1719
b.iter(|| {
1820
let mut data = TernaryTreeList::Empty;
1921

20-
for idx in 0..1000 {
21-
data = data.append(idx)
22-
}
23-
})
24-
});
25-
26-
c.bench_function("append to list", |b| {
27-
b.iter(|| {
28-
let mut data = TernaryTreeList::Empty;
29-
30-
for idx in 0..1000 {
22+
for idx in 0..ITER_SIZE {
3123
data = data.append(idx)
3224
}
3325
})
3426
});
35-
36-
c.bench_function("push_right list", |b| {
37-
b.iter(|| {
38-
let mut data = TernaryTreeList::Empty;
39-
40-
for idx in 0..1000 {
41-
data = data.push_right(idx)
42-
}
43-
})
44-
});
45-
46-
c.bench_function("unshift to list", |b| {
47-
b.iter(|| {
48-
let mut data = TernaryTreeList::Empty;
49-
50-
for idx in 0..1000 {
51-
data = data.unshift(idx)
52-
}
53-
})
54-
});
55-
56-
c.bench_function("push_left list", |b| {
57-
b.iter(|| {
58-
let mut data = TernaryTreeList::Empty;
59-
60-
for idx in 0..1000 {
61-
data = data.push_left(idx)
62-
}
63-
})
64-
});
65-
66-
c.bench_function("inserting in middle", |b| {
67-
b.iter(|| {
68-
let mut data = TernaryTreeList::Empty;
69-
70-
// TODO overflowed
71-
for idx in 0..1000 {
72-
let pos = idx / 2;
73-
data = data.insert(pos, idx, false).unwrap()
74-
}
75-
})
76-
});
77-
78-
c.bench_function("rest", |b| {
79-
let mut data = TernaryTreeList::Empty;
80-
81-
for idx in 0..1000 {
82-
data = data.push(idx);
83-
}
84-
85-
b.iter(move || {
86-
let mut d = data.to_owned();
87-
88-
while !d.is_empty() {
89-
d = d.slice(1, d.len()).unwrap()
90-
}
91-
})
92-
});
93-
94-
c.bench_function("rest from push_right", |b| {
95-
let mut data = TernaryTreeList::Empty;
96-
97-
for idx in 0..1000 {
98-
data = data.push_right(idx);
99-
}
100-
101-
b.iter(move || {
102-
let mut d = data.to_owned();
103-
104-
while !d.is_empty() {
105-
d = d.slice(1, d.len()).unwrap()
106-
}
107-
})
108-
});
109-
110-
c.bench_function("drop-left", |b| {
111-
let mut data = TernaryTreeList::Empty;
112-
113-
for idx in 0..1000 {
114-
data = data.push(idx);
115-
}
116-
117-
b.iter(move || {
118-
let mut d = data.to_owned();
119-
120-
while d.len() > 1 {
121-
d = d.drop_left()
122-
}
123-
})
124-
});
125-
126-
c.bench_function("drop-right", |b| {
127-
let mut data = TernaryTreeList::Empty;
128-
129-
for idx in 0..1000 {
130-
data = data.push(idx);
131-
}
132-
133-
b.iter(move || {
134-
let mut d = data.to_owned();
135-
136-
while d.len() > 1 {
137-
d = d.drop_right()
138-
}
139-
})
140-
});
141-
142-
c.bench_function("drop-left-shallow", |b| {
143-
let mut data = TernaryTreeList::Empty;
144-
145-
for idx in 0..1000 {
146-
data = data.push(idx);
147-
}
148-
149-
b.iter(move || {
150-
let mut d = data.to_owned();
151-
152-
while d.len() > 1 {
153-
d = d.drop_left_shallow()
154-
}
155-
})
156-
});
157-
158-
c.bench_function("drop-right-shallow", |b| {
159-
let mut data = TernaryTreeList::Empty;
160-
161-
for idx in 0..1000 {
162-
data = data.push(idx);
163-
}
164-
165-
b.iter(move || {
166-
let mut d = data.to_owned();
167-
168-
while d.len() > 1 {
169-
d = d.drop_right_shallow()
170-
}
171-
})
172-
});
173-
174-
c.bench_function("drop-left from push_right", |b| {
175-
let mut data = TernaryTreeList::Empty;
176-
177-
for idx in 0..1000 {
178-
data = data.push_right(idx);
179-
}
180-
181-
b.iter(move || {
182-
let mut d = data.to_owned();
183-
184-
while d.len() > 1 {
185-
d = d.drop_left()
186-
}
187-
})
188-
});
189-
190-
c.bench_function("slice", |b| {
191-
let mut data = TernaryTreeList::Empty;
192-
193-
for idx in 0..1000 {
194-
data = data.push(idx)
195-
}
196-
197-
b.iter(move || {
198-
let d = data.to_owned();
199-
200-
for _ in 0..1000 {
201-
d.slice(300, 600).unwrap();
202-
}
203-
})
204-
});
205-
206-
c.bench_function("index", |b| {
207-
let mut data = TernaryTreeList::Empty;
208-
209-
for idx in 0..1000 {
210-
data = data.push(idx)
211-
}
212-
213-
b.iter(|| {
214-
for idx in 0..1000 {
215-
let _ = data[idx];
216-
}
217-
})
218-
});
219-
220-
c.bench_function("get", |b| {
221-
let mut data = TernaryTreeList::Empty;
222-
223-
for idx in 0..1000 {
224-
data = data.push(idx)
225-
}
226-
227-
b.iter(|| {
228-
for idx in 0..1000 {
229-
let _ = data.get(idx);
230-
}
231-
})
232-
});
233-
234-
c.bench_function("loop_get", |b| {
235-
let mut data = TernaryTreeList::Empty;
236-
237-
for idx in 0..1000 {
238-
data = data.push(idx)
239-
}
240-
241-
b.iter(|| {
242-
for idx in 0..1000 {
243-
let _ = data.loop_get(idx);
244-
}
245-
})
246-
});
247-
248-
c.bench_function("ref_get", |b| {
249-
let mut data = TernaryTreeList::Empty;
250-
251-
for idx in 0..1000 {
252-
data = data.push(idx)
253-
}
254-
255-
b.iter(|| {
256-
for idx in 0..1000 {
257-
let _ = data.ref_get(idx).to_owned();
258-
}
259-
})
260-
});
261-
262-
c.bench_function("first", |b| {
263-
let mut data = TernaryTreeList::Empty;
264-
265-
for idx in 0..1000 {
266-
data = data.push(idx)
267-
}
268-
269-
b.iter(|| {
270-
for _ in 0..10000 {
271-
let _ = data.first();
272-
}
273-
})
274-
});
27527
}
27628

27729
criterion_group!(benches, criterion_benchmark);

0 commit comments

Comments
 (0)