Skip to content

Commit 6ba3623

Browse files
Add benchmarks
1 parent d3a21fd commit 6ba3623

File tree

3 files changed

+359
-8
lines changed

3 files changed

+359
-8
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ redoxql = { path = "." }
1919
name = "page_benchmarks"
2020
harness = false
2121

22+
[[bench]]
23+
name = "query_benchmarks"
24+
harness = false
25+
2226
# Speed improvements
2327
[profile.release]
2428
lto = "fat"

benches/query_benchmarks.rs

Lines changed: 347 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,347 @@
1+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
2+
use redoxql::database::RDatabase;
3+
use redoxql::query::RQuery;
4+
5+
fn bench_insert(c: &mut Criterion) {
6+
c.bench_function("single insert", |b| {
7+
b.iter_with_setup(
8+
|| {
9+
let mut db = RDatabase::new();
10+
let table = db.create_table(String::from("Grades"), 3, 0);
11+
RQuery::new(table)
12+
},
13+
|mut query| {
14+
query.insert(black_box(vec![1, 2, 3]));
15+
},
16+
)
17+
});
18+
}
19+
20+
fn bench_select(c: &mut Criterion) {
21+
c.bench_function("single select", |b| {
22+
b.iter_with_setup(
23+
|| {
24+
let mut db = RDatabase::new();
25+
let table = db.create_table(String::from("Grades"), 3, 0);
26+
let mut query = RQuery::new(table);
27+
query.insert(vec![1, 2, 3]);
28+
query
29+
},
30+
|mut query| {
31+
black_box(query.select(black_box(1), black_box(0), black_box(vec![1, 1, 1])));
32+
},
33+
)
34+
});
35+
}
36+
37+
fn bench_update(c: &mut Criterion) {
38+
c.bench_function("single update", |b| {
39+
b.iter_with_setup(
40+
|| {
41+
let mut db = RDatabase::new();
42+
let table = db.create_table(String::from("Grades"), 3, 0);
43+
let mut query = RQuery::new(table);
44+
query.insert(vec![1, 2, 3]);
45+
query
46+
},
47+
|mut query| {
48+
query.update(
49+
black_box(1),
50+
black_box(vec![Some(1), Some(5), Some(6)]),
51+
);
52+
},
53+
)
54+
});
55+
}
56+
57+
fn bench_delete(c: &mut Criterion) {
58+
c.bench_function("single delete", |b| {
59+
b.iter_with_setup(
60+
|| {
61+
let mut db = RDatabase::new();
62+
let table = db.create_table(String::from("Grades"), 3, 0);
63+
let mut query = RQuery::new(table);
64+
query.insert(vec![1, 2, 3]);
65+
query
66+
},
67+
|mut query| {
68+
query.delete(black_box(1));
69+
},
70+
)
71+
});
72+
}
73+
74+
fn bench_increment(c: &mut Criterion) {
75+
c.bench_function("single increment", |b| {
76+
b.iter_with_setup(
77+
|| {
78+
let mut db = RDatabase::new();
79+
let table = db.create_table(String::from("Grades"), 3, 0);
80+
let mut query = RQuery::new(table);
81+
query.insert(vec![1, 2, 3]);
82+
query
83+
},
84+
|mut query| {
85+
query.increment(black_box(1), black_box(0));
86+
},
87+
)
88+
});
89+
}
90+
91+
fn bench_select_version(c: &mut Criterion) {
92+
c.bench_function("select version", |b| {
93+
b.iter_with_setup(
94+
|| {
95+
let mut db = RDatabase::new();
96+
let table = db.create_table(String::from("Grades"), 3, 0);
97+
let mut query = RQuery::new(table);
98+
query.insert(vec![1, 2, 3]);
99+
query.update(1, vec![Some(1), Some(4), Some(5)]);
100+
query.update(1, vec![Some(1), Some(6), Some(7)]);
101+
query
102+
},
103+
|mut query| {
104+
black_box(query.select_version(
105+
black_box(1),
106+
black_box(0),
107+
black_box(vec![1, 1, 1]),
108+
black_box(1),
109+
));
110+
},
111+
)
112+
});
113+
}
114+
115+
fn bench_multiple_updates(c: &mut Criterion) {
116+
let mut group = c.benchmark_group("multiple updates");
117+
for updates in [1, 5, 10].iter() {
118+
group.bench_with_input(format!("{} updates", updates), updates, |b, &updates| {
119+
b.iter_with_setup(
120+
|| {
121+
let mut db = RDatabase::new();
122+
let table = db.create_table(String::from("Grades"), 3, 0);
123+
let mut query = RQuery::new(table);
124+
query.insert(vec![1, 2, 3]);
125+
query
126+
},
127+
|mut query| {
128+
for _ in 0..updates {
129+
query.update(1, vec![Some(1), Some(5), Some(6)]);
130+
}
131+
},
132+
)
133+
});
134+
}
135+
group.finish();
136+
}
137+
138+
fn bench_sum(c: &mut Criterion) {
139+
let mut group = c.benchmark_group("sum operation");
140+
for size in [10, 100, 1000].iter() {
141+
group.bench_with_input(format!("sum {} records", size), size, |b, &size| {
142+
b.iter_with_setup(
143+
|| {
144+
let mut db = RDatabase::new();
145+
let table = db.create_table(String::from("Grades"), 3, 0);
146+
let mut query = RQuery::new(table);
147+
for i in 0..size {
148+
query.insert(vec![i as i64, i as i64 * 2, i as i64 * 3]);
149+
}
150+
query
151+
},
152+
|mut query| {
153+
black_box(query.sum(black_box(0), black_box(size as i64 - 1), black_box(1)));
154+
},
155+
)
156+
});
157+
}
158+
group.finish();
159+
}
160+
161+
fn bench_bulk_insert(c: &mut Criterion) {
162+
let mut group = c.benchmark_group("bulk inserts");
163+
for size in [10, 100, 1000, 10000].iter() {
164+
group.bench_with_input(format!("{} inserts", size), size, |b, &size| {
165+
b.iter_with_setup(
166+
|| {
167+
let mut db = RDatabase::new();
168+
let table = db.create_table(String::from("Grades"), 3, 0);
169+
RQuery::new(table)
170+
},
171+
|mut query| {
172+
for i in 0..size {
173+
query.insert(black_box(vec![i as i64, i as i64 * 2, i as i64 * 3]));
174+
}
175+
},
176+
)
177+
});
178+
}
179+
group.finish();
180+
}
181+
182+
fn bench_bulk_select(c: &mut Criterion) {
183+
let mut group = c.benchmark_group("bulk selects");
184+
for size in [10, 100, 1000, 10000].iter() {
185+
group.bench_with_input(format!("{} selects", size), size, |b, &size| {
186+
b.iter_with_setup(
187+
|| {
188+
let mut db = RDatabase::new();
189+
let table = db.create_table(String::from("Grades"), 3, 0);
190+
let mut query = RQuery::new(table);
191+
192+
for i in 0..size {
193+
query.insert(vec![i as i64, i as i64 * 2, i as i64 * 3]);
194+
}
195+
query
196+
},
197+
|mut query| {
198+
for i in 0..size {
199+
black_box(query.select(black_box(i as i64), black_box(0), black_box(vec![1, 1, 1])));
200+
}
201+
},
202+
)
203+
});
204+
}
205+
group.finish();
206+
}
207+
208+
fn bench_bulk_update(c: &mut Criterion) {
209+
let mut group = c.benchmark_group("bulk updates");
210+
for size in [10, 100, 1000, 10000].iter() {
211+
group.bench_with_input(format!("{} updates", size), size, |b, &size| {
212+
b.iter_with_setup(
213+
|| {
214+
let mut db = RDatabase::new();
215+
let table = db.create_table(String::from("Grades"), 3, 0);
216+
let mut query = RQuery::new(table);
217+
218+
for i in 0..size {
219+
query.insert(vec![i as i64, i as i64 * 2, i as i64 * 3]);
220+
}
221+
query
222+
},
223+
|mut query| {
224+
for i in 0..size {
225+
query.update(
226+
black_box(i as i64),
227+
black_box(vec![Some(i as i64), Some(i as i64 * 5), Some(i as i64 * 6)]),
228+
);
229+
}
230+
},
231+
)
232+
});
233+
}
234+
group.finish();
235+
}
236+
237+
fn bench_bulk_delete(c: &mut Criterion) {
238+
let mut group = c.benchmark_group("bulk deletes");
239+
for size in [10, 100, 1000, 10000].iter() {
240+
group.bench_with_input(format!("{} deletes", size), size, |b, &size| {
241+
b.iter_with_setup(
242+
|| {
243+
let mut db = RDatabase::new();
244+
let table = db.create_table(String::from("Grades"), 3, 0);
245+
let mut query = RQuery::new(table);
246+
247+
for i in 0..size {
248+
query.insert(vec![i as i64, i as i64 * 2, i as i64 * 3]);
249+
}
250+
query
251+
},
252+
|mut query| {
253+
for i in 0..size {
254+
query.delete(black_box(i as i64));
255+
}
256+
},
257+
)
258+
});
259+
}
260+
group.finish();
261+
}
262+
263+
fn bench_mixed_workload(c: &mut Criterion) {
264+
let mut group = c.benchmark_group("mixed operations");
265+
for size in [10, 100, 1000, 10000].iter() {
266+
group.bench_with_input(format!("{} mixed operations", size), size, |b, &size| {
267+
b.iter_with_setup(
268+
|| {
269+
let mut db = RDatabase::new();
270+
let table = db.create_table(String::from("Grades"), 3, 0);
271+
let mut query = RQuery::new(table);
272+
273+
for i in 0..size/2 {
274+
query.insert(vec![i as i64, i as i64 * 2, i as i64 * 3]);
275+
}
276+
query
277+
},
278+
|mut query| {
279+
for i in 0..size {
280+
match i % 4 {
281+
0 => { let _ = query.insert(black_box(vec![i as i64, i as i64 * 2, i as i64 * 3])); },
282+
1 => { let _ = query.select(black_box(i as i64 / 2), black_box(0), black_box(vec![1, 1, 1])); },
283+
2 => { let _ = query.update(black_box(i as i64 / 2), black_box(vec![Some(i as i64), Some(i as i64 * 5), Some(i as i64 * 6)])); },
284+
3 => { let _ = query.delete(black_box(i as i64 / 2)); },
285+
_ => unreachable!()
286+
}
287+
}
288+
},
289+
)
290+
});
291+
}
292+
group.finish();
293+
}
294+
295+
fn bench_version_history(c: &mut Criterion) {
296+
let mut group = c.benchmark_group("version history");
297+
for updates in [5, 10, 50, 100].iter() {
298+
group.bench_with_input(format!("{} version history", updates), updates, |b, &updates| {
299+
b.iter_with_setup(
300+
|| {
301+
let mut db = RDatabase::new();
302+
let table = db.create_table(String::from("Grades"), 3, 0);
303+
let mut query = RQuery::new(table);
304+
305+
query.insert(vec![1, 2, 3]);
306+
307+
for i in 0..updates {
308+
query.update(1, vec![Some(1), Some(i), Some(i + 1)]);
309+
}
310+
query
311+
},
312+
|mut query| {
313+
314+
for version in 0..updates {
315+
black_box(query.select_version(
316+
black_box(1),
317+
black_box(0),
318+
black_box(vec![1, 1, 1]),
319+
black_box(version),
320+
));
321+
}
322+
},
323+
)
324+
});
325+
}
326+
group.finish();
327+
}
328+
329+
330+
criterion_group!(
331+
benches,
332+
bench_insert,
333+
bench_select,
334+
bench_update,
335+
bench_delete,
336+
bench_increment,
337+
bench_select_version,
338+
bench_multiple_updates,
339+
bench_sum,
340+
bench_bulk_insert,
341+
bench_bulk_select,
342+
bench_bulk_update,
343+
bench_bulk_delete,
344+
bench_mixed_workload,
345+
bench_version_history
346+
);
347+
criterion_main!(benches);

0 commit comments

Comments
 (0)