Skip to content

Commit e85553c

Browse files
committed
add benches for find slicing
equal bench with reuse time: [510.30 ns 512.16 ns 514.26 ns] equal bench without reuse time: [21.436 µs 21.456 µs 21.479 µs] regex bench with reuse time: [58.875 µs 58.925 µs 58.975 µs] regex bench without reuse time: [85.324 µs 85.416 µs 85.517 µs] JsonPathInst generation time: [23.988 µs 24.019 µs 24.052 µs]
1 parent 46d145b commit e85553c

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,12 @@ thiserror = "1.0.50"
2020

2121
[dev-dependencies]
2222
lazy_static = "1.0"
23+
criterion = "0.5.1"
24+
25+
[[bench]]
26+
name = "regex"
27+
harness = false
28+
29+
[[bench]]
30+
name = "equal"
31+
harness = false

benches/equal.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
use jsonpath_rust::{JsonPathInst, JsonPathQuery};
3+
use serde_json::json;
4+
use std::str::FromStr;
5+
6+
struct SearchData {
7+
json: serde_json::Value,
8+
path: JsonPathInst,
9+
}
10+
11+
const PATH: &'static str = "$.[?(@.author == 'abcd(Rees)')]";
12+
13+
fn equal_perf_test_with_reuse(cfg: &SearchData) {
14+
let _v = jsonpath_rust::find(&cfg.path, &cfg.json);
15+
}
16+
17+
fn equal_perf_test_without_reuse() {
18+
let json = Box::new(json!({
19+
"author":"abcd(Rees)",
20+
}));
21+
22+
let _v = json.path(PATH).expect("the path is correct");
23+
}
24+
25+
pub fn criterion_benchmark(c: &mut Criterion) {
26+
let data = SearchData {
27+
json: json!({
28+
"author":"abcd(Rees)",
29+
}),
30+
path: JsonPathInst::from_str(PATH).unwrap(),
31+
};
32+
c.bench_function("equal bench with reuse", |b| {
33+
b.iter(|| equal_perf_test_with_reuse(&data))
34+
});
35+
c.bench_function("equal bench without reuse", |b| {
36+
b.iter(|| equal_perf_test_without_reuse())
37+
});
38+
}
39+
40+
criterion_group!(benches, criterion_benchmark);
41+
criterion_main!(benches);

benches/regex.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
use jsonpath_rust::{JsonPathInst, JsonPathQuery};
3+
use serde_json::json;
4+
use std::str::FromStr;
5+
6+
struct SearchData {
7+
json: serde_json::Value,
8+
path: JsonPathInst,
9+
}
10+
11+
const PATH: &'static str = "$.[?(@.author ~= '.*(?i)d\\(Rees\\)')]";
12+
13+
fn regex_perf_test_with_reuse(cfg: &SearchData) {
14+
let _v = jsonpath_rust::find(&cfg.path, &cfg.json);
15+
}
16+
17+
fn regex_perf_test_without_reuse() {
18+
let json = Box::new(json!({
19+
"author":"abcd(Rees)",
20+
}));
21+
22+
let _v = json.path(PATH).expect("the path is correct");
23+
}
24+
25+
fn json_path_inst_compiling() {
26+
let _v = JsonPathInst::from_str(PATH).unwrap();
27+
}
28+
29+
pub fn criterion_benchmark(c: &mut Criterion) {
30+
let data = SearchData {
31+
json: json!({
32+
"author":"abcd(Rees)",
33+
}),
34+
path: JsonPathInst::from_str(PATH).unwrap(),
35+
};
36+
c.bench_function("regex bench with reuse", |b| {
37+
b.iter(|| regex_perf_test_with_reuse(&data))
38+
});
39+
c.bench_function("regex bench without reuse", |b| {
40+
b.iter(|| regex_perf_test_without_reuse())
41+
});
42+
c.bench_function("JsonPathInst generation", |b| {
43+
b.iter(|| json_path_inst_compiling())
44+
});
45+
}
46+
47+
criterion_group!(benches, criterion_benchmark);
48+
criterion_main!(benches);

0 commit comments

Comments
 (0)