diff --git a/Cargo.toml b/Cargo.toml index 0fd687e..d709ff7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,12 @@ thiserror = "1.0.50" [dev-dependencies] lazy_static = "1.0" +criterion = "0.5.1" + +[[bench]] +name = "regex" +harness = false + +[[bench]] +name = "equal" +harness = false diff --git a/benches/equal.rs b/benches/equal.rs new file mode 100644 index 0000000..10104dc --- /dev/null +++ b/benches/equal.rs @@ -0,0 +1,41 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use jsonpath_rust::{JsonPathInst, JsonPathQuery}; +use serde_json::json; +use std::str::FromStr; + +struct SearchData { + json: serde_json::Value, + path: JsonPathInst, +} + +const PATH: &'static str = "$.[?(@.author == 'abcd(Rees)')]"; + +fn equal_perf_test_with_reuse(cfg: &SearchData) { + let _v = jsonpath_rust::find(&cfg.path, &cfg.json); +} + +fn equal_perf_test_without_reuse() { + let json = Box::new(json!({ + "author":"abcd(Rees)", + })); + + let _v = json.path(PATH).expect("the path is correct"); +} + +pub fn criterion_benchmark(c: &mut Criterion) { + let data = SearchData { + json: json!({ + "author":"abcd(Rees)", + }), + path: JsonPathInst::from_str(PATH).unwrap(), + }; + c.bench_function("equal bench with reuse", |b| { + b.iter(|| equal_perf_test_with_reuse(&data)) + }); + c.bench_function("equal bench without reuse", |b| { + b.iter(|| equal_perf_test_without_reuse()) + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/benches/regex.rs b/benches/regex.rs new file mode 100644 index 0000000..6e0941d --- /dev/null +++ b/benches/regex.rs @@ -0,0 +1,48 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use jsonpath_rust::{JsonPathInst, JsonPathQuery}; +use serde_json::json; +use std::str::FromStr; + +struct SearchData { + json: serde_json::Value, + path: JsonPathInst, +} + +const PATH: &'static str = "$.[?(@.author ~= '.*(?i)d\\(Rees\\)')]"; + +fn regex_perf_test_with_reuse(cfg: &SearchData) { + let _v = jsonpath_rust::find(&cfg.path, &cfg.json); +} + +fn regex_perf_test_without_reuse() { + let json = Box::new(json!({ + "author":"abcd(Rees)", + })); + + let _v = json.path(PATH).expect("the path is correct"); +} + +fn json_path_inst_compiling() { + let _v = JsonPathInst::from_str(PATH).unwrap(); +} + +pub fn criterion_benchmark(c: &mut Criterion) { + let data = SearchData { + json: json!({ + "author":"abcd(Rees)", + }), + path: JsonPathInst::from_str(PATH).unwrap(), + }; + c.bench_function("regex bench with reuse", |b| { + b.iter(|| regex_perf_test_with_reuse(&data)) + }); + c.bench_function("regex bench without reuse", |b| { + b.iter(|| regex_perf_test_without_reuse()) + }); + c.bench_function("JsonPathInst generation", |b| { + b.iter(|| json_path_inst_compiling()) + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches);