Skip to content

Commit 5fc18ab

Browse files
committed
Add iai versions of the multi-like evaluation benchmarks
1 parent b2ce0ce commit 5fc18ab

File tree

5 files changed

+454
-314
lines changed

5 files changed

+454
-314
lines changed

deny.toml

+5-1
Original file line numberDiff line numberDiff line change
@@ -152,5 +152,9 @@ unknown-git = "deny"
152152
# if not specified. If it is specified but empty, no registries are allowed.
153153
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
154154
# List of URLs for allowed Git repositories
155-
allow-git = []
155+
allow-git = [
156+
# Allow running iai benchmarks on MacOS
157+
# Cf. "https://github.com/bheisler/iai/issues/25#issuecomment-1378856308"
158+
"https://github.com/bheisler/iai.git",
159+
]
156160

partiql/Cargo.toml

+6
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,14 @@ partiql-eval = { path = "../partiql-eval" }
3232

3333
itertools = "0.10"
3434
criterion = "0.4"
35+
iai = { git = "https://github.com/bheisler/iai" }
3536
rand = "0.8"
37+
once_cell = "1.17"
3638

3739
[[bench]]
3840
name = "bench_eval_multi_like"
3941
harness = false
42+
43+
[[bench]]
44+
name = "bench_eval_multi_like_iai"
45+
harness = false

partiql/benches/bench_eval_multi_like.rs

+4-313
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
use std::time::Duration;
22

33
use criterion::{black_box, criterion_group, criterion_main, Criterion};
4-
use itertools::Itertools;
5-
use rand::{Rng, SeedableRng};
64

75
use partiql_eval::env::basic::MapBindings;
86
use partiql_eval::eval::EvalPlan;
97
use partiql_eval::plan::EvaluatorPlanner;
108
use partiql_logical::{BindingsOp, LogicalPlan};
119

10+
use crate::multi_like_data::{employee_data, QUERY_1, QUERY_15, QUERY_30};
1211
use partiql_parser::{Parser, ParserResult};
13-
use partiql_value::{partiql_tuple, Bag, Tuple, Value};
12+
use partiql_value::Value;
1413

1514
// Benchmarks:
1615
// - parsing,
@@ -21,315 +20,7 @@ use partiql_value::{partiql_tuple, Bag, Tuple, Value};
2120
// of queries that filter against 1, 15, or 30 `OR`ed `LIKE` expressions
2221
// over 10201 rows of tuples containing an id and a string
2322

24-
fn employee_data() -> Vec<Value> {
25-
let name1 = vec![
26-
"Bob",
27-
"Madden",
28-
"Brycen",
29-
"Bryanna",
30-
"Zayne",
31-
"Jocelynn",
32-
"Breanna",
33-
"Margaret",
34-
"Jasmine",
35-
"Kenyon",
36-
"Aryanna",
37-
"Zackery",
38-
"Jorden",
39-
"Malia",
40-
"Raven",
41-
"Neveah",
42-
"Finley",
43-
"Austin",
44-
"Jaxson",
45-
"Tobias",
46-
"Dominique",
47-
"Devan",
48-
"Colby",
49-
"Tanner",
50-
"Mckenna",
51-
"Kristina",
52-
"Cristal",
53-
"River",
54-
"Taliyah",
55-
"Abagail",
56-
"Spencer",
57-
"Gage",
58-
"Ronnie",
59-
"Amari",
60-
"Jabari",
61-
"Alanna",
62-
"Anderson",
63-
"Saniya",
64-
"Baylee",
65-
"Elisa",
66-
"Savannah",
67-
"Jakobe",
68-
"Sandra",
69-
"Simone",
70-
"Frank",
71-
"Braedon",
72-
"Clark",
73-
"Francisco",
74-
"Roman",
75-
"Matias",
76-
"Messi",
77-
"Elisha",
78-
"Alexander",
79-
"Kadence",
80-
"Karsyn",
81-
"Adonis",
82-
"Ishaan",
83-
"Trevon",
84-
"Ryan",
85-
"Jaelynn",
86-
"Marilyn",
87-
"Emma",
88-
"Avah",
89-
"Jordan",
90-
"Riley",
91-
"Amelie",
92-
"Denisse",
93-
"Darion",
94-
"Lydia",
95-
"Marley",
96-
"Brogan",
97-
"Trace",
98-
"Maeve",
99-
"Elijah",
100-
"Kareem",
101-
"Erick",
102-
"Hope",
103-
"Elisabeth",
104-
"Antwan",
105-
"Francesca",
106-
"Layla",
107-
"Jase",
108-
"Angel",
109-
"Addyson",
110-
"Mckinley",
111-
"Julianna",
112-
"Winston",
113-
"Royce",
114-
"Paola",
115-
"Issac",
116-
"Zachary",
117-
"Niko",
118-
"Shania",
119-
"Colin",
120-
"Jesse",
121-
"Pedro",
122-
"Cheyenne",
123-
"Ashley",
124-
"Karli",
125-
"Bianca",
126-
"Mario",
127-
];
128-
let name2 = vec![
129-
"Smith",
130-
"Oconnell",
131-
"Whitehead",
132-
"Carrillo",
133-
"Parrish",
134-
"Monroe",
135-
"Summers",
136-
"Hurst",
137-
"Durham",
138-
"Hardin",
139-
"Hunt",
140-
"Mitchell",
141-
"Pennington",
142-
"Woodward",
143-
"Franklin",
144-
"Martinez",
145-
"Shepard",
146-
"Khan",
147-
"Mcfarland",
148-
"Frey",
149-
"Mckenzie",
150-
"Blair",
151-
"Mercer",
152-
"Callahan",
153-
"Cameron",
154-
"Gilmore",
155-
"Bowers",
156-
"Donovan",
157-
"Meyers",
158-
"Horne",
159-
"Rice",
160-
"Castillo",
161-
"Cain",
162-
"Dickson",
163-
"Valenzuela",
164-
"Silva",
165-
"Prince",
166-
"Vance",
167-
"Berry",
168-
"Coffey",
169-
"Young",
170-
"Walker",
171-
"Burch",
172-
"Ross",
173-
"Mejia",
174-
"Zuniga",
175-
"Haney",
176-
"Jordan",
177-
"Love",
178-
"Larsen",
179-
"Bowman",
180-
"Werner",
181-
"Greer",
182-
"Krause",
183-
"Bishop",
184-
"Day",
185-
"Luna",
186-
"Patrick",
187-
"Adkins",
188-
"Benson",
189-
"Mcconnell",
190-
"Sanchez",
191-
"Villa",
192-
"Wu",
193-
"Duke",
194-
"Fisher",
195-
"Hess",
196-
"Lawrence",
197-
"Perry",
198-
"Hardy",
199-
"Wyatt",
200-
"Mcknight",
201-
"Thomas",
202-
"Trevino",
203-
"Flowers",
204-
"Cisneros",
205-
"Coleman",
206-
"Sanders",
207-
"Good",
208-
"Newton",
209-
"Carpenter",
210-
"Garza",
211-
"Barber",
212-
"Swanson",
213-
"Owen",
214-
"Anderson",
215-
"Bright",
216-
"Beck",
217-
"Lawson",
218-
"Jones",
219-
"Davila",
220-
"Porter",
221-
"Dougherty",
222-
"Stevenson",
223-
"Malone",
224-
"Garrison",
225-
"Bates",
226-
"Wheeler",
227-
"Petty",
228-
"Rojas",
229-
"Townsend",
230-
];
231-
232-
// cartesian product of name1 x name2 (e.g., "Bob Smith", ... "Mario Townsend")
233-
let combined = name1
234-
.iter()
235-
.cartesian_product(name2.iter())
236-
.map(|(n1, n2)| format!("{n1} {n2}"));
237-
238-
// seed the rng with a known value to assure same data across runs
239-
let mut rng = rand::rngs::StdRng::from_seed([42; 32]);
240-
use rand::distributions::Distribution;
241-
let chars = rand::distributions::Alphanumeric;
242-
let random_size = rand::distributions::uniform::Uniform::from(5..=100);
243-
244-
// add random string prefix and suffix to each combined name
245-
let employee_data: Vec<Value> = combined
246-
.enumerate()
247-
.map(|(id, person)| {
248-
let prefix_size = random_size.sample(&mut rng);
249-
let suffix_size = random_size.sample(&mut rng);
250-
let prefix: String = (0..prefix_size)
251-
.map(|_| rng.sample(chars) as char)
252-
.collect();
253-
let suffix: String = (0..suffix_size)
254-
.map(|_| rng.sample(chars) as char)
255-
.collect();
256-
let full_name = format!("{prefix} {person} {suffix}");
257-
partiql_tuple![("id", id), ("name", full_name)].into()
258-
})
259-
.collect_vec();
260-
261-
employee_data
262-
}
263-
264-
fn data() -> MapBindings<Value> {
265-
let data = partiql_tuple![(
266-
"hr",
267-
partiql_tuple![("employees", Bag::from(employee_data()))]
268-
)];
269-
270-
data.into()
271-
}
272-
273-
const QUERY_1: &str = "
274-
SELECT *
275-
FROM hr.employees as emp
276-
WHERE lower(emp.name) LIKE '%bob smith%'
277-
";
278-
279-
const QUERY_15: &str = "
280-
SELECT *
281-
FROM hr.employees as emp
282-
WHERE lower(emp.name) LIKE '%bob smith%'
283-
OR lower(emp.name) LIKE '%gage swanson%'
284-
OR lower(emp.name) LIKE '%riley perry%'
285-
OR lower(emp.name) LIKE '%sandra woodward%'
286-
OR lower(emp.name) LIKE '%abagail oconnell%'
287-
OR lower(emp.name) LIKE '%amari duke%'
288-
OR lower(emp.name) LIKE '%elisha wyatt%'
289-
OR lower(emp.name) LIKE '%aryanna hess%'
290-
OR lower(emp.name) LIKE '%bryanna jones%'
291-
OR lower(emp.name) LIKE '%trace gilmore%'
292-
OR lower(emp.name) LIKE '%antwan stevenson%'
293-
OR lower(emp.name) LIKE '%julianna callahan%'
294-
OR lower(emp.name) LIKE '%jaelynn trevino%'
295-
OR lower(emp.name) LIKE '%kadence bates%'
296-
OR lower(emp.name) LIKE '%jakobe townsend%'
297-
";
298-
299-
const QUERY_30: &str = "
300-
SELECT *
301-
FROM hr.employees as emp
302-
WHERE lower(emp.name) LIKE '%bob smith%'
303-
OR lower(emp.name) LIKE '%gage swanson%'
304-
OR lower(emp.name) LIKE '%riley perry%'
305-
OR lower(emp.name) LIKE '%sandra woodward%'
306-
OR lower(emp.name) LIKE '%abagail oconnell%'
307-
OR lower(emp.name) LIKE '%amari duke%'
308-
OR lower(emp.name) LIKE '%elisha wyatt%'
309-
OR lower(emp.name) LIKE '%aryanna hess%'
310-
OR lower(emp.name) LIKE '%bryanna jones%'
311-
OR lower(emp.name) LIKE '%trace gilmore%'
312-
OR lower(emp.name) LIKE '%antwan stevenson%'
313-
OR lower(emp.name) LIKE '%julianna callahan%'
314-
OR lower(emp.name) LIKE '%jaelynn trevino%'
315-
OR lower(emp.name) LIKE '%kadence bates%'
316-
OR lower(emp.name) LIKE '%jakobe townsend%'
317-
OR lower(emp.name) LIKE '%austin pennington%'
318-
OR lower(emp.name) LIKE '%colby woodward%'
319-
OR lower(emp.name) LIKE '%brycen blair%'
320-
OR lower(emp.name) LIKE '%cristal mercer%'
321-
OR lower(emp.name) LIKE '%river gilmore%'
322-
OR lower(emp.name) LIKE '%saniya bowers%'
323-
OR lower(emp.name) LIKE '%braedon ross%'
324-
OR lower(emp.name) LIKE '%clark mejia%'
325-
OR lower(emp.name) LIKE '%ryan day%'
326-
OR lower(emp.name) LIKE '%marilyn luna%'
327-
OR lower(emp.name) LIKE '%avah sanchez%'
328-
OR lower(emp.name) LIKE '%amelie wu%'
329-
OR lower(emp.name) LIKE '%paola duke%'
330-
OR lower(emp.name) LIKE '%jesse trevino%'
331-
OR lower(emp.name) LIKE '%bianca cisneros%'
332-
";
23+
mod multi_like_data;
33324

33425
#[inline]
33526
fn parse(text: &str) -> ParserResult {
@@ -413,7 +104,7 @@ fn bench_eval(c: &mut Criterion) {
413104
let compiled_15 = compile(&parse(QUERY_15).unwrap());
414105
let compiled_30 = compile(&parse(QUERY_30).unwrap());
415106

416-
let bindings = data();
107+
let bindings = employee_data();
417108

418109
c.bench_function("eval-1", |b| {
419110
b.iter(|| {

0 commit comments

Comments
 (0)