diff --git a/docs/benchmarking.md b/docs/benchmarking.md new file mode 100644 index 000000000..feae53c84 --- /dev/null +++ b/docs/benchmarking.md @@ -0,0 +1,6 @@ +# Benchmarking + +Run `cargo bench` in the project `sqlparser_bench` execute the queries. +It will report results using the `criterion` library to perform the benchmarking. + +The bench project lives in another crate, to avoid the negative impact on building the `sqlparser` crate. diff --git a/sqlparser_bench/Cargo.toml b/sqlparser_bench/Cargo.toml new file mode 100644 index 000000000..43ea11913 --- /dev/null +++ b/sqlparser_bench/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "sqlparser_bench" +version = "0.1.0" +authors = ["Dandandan "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +sqlparser = { path = "../", version = "0.5.1-alpha-0" } + +[dev-dependencies] +criterion = {version = "0.3"} + +[[bench]] +name = "sqlparser_bench" +harness = false diff --git a/sqlparser_bench/benches/sqlparser_bench.rs b/sqlparser_bench/benches/sqlparser_bench.rs new file mode 100644 index 000000000..5293c0f50 --- /dev/null +++ b/sqlparser_bench/benches/sqlparser_bench.rs @@ -0,0 +1,43 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use criterion::{criterion_group, criterion_main, Criterion}; +use sqlparser::dialect::GenericDialect; +use sqlparser::parser::Parser; + +fn basic_queries(c: &mut Criterion) { + let mut group = c.benchmark_group("sqlparser-rs parsing benchmark"); + let dialect = GenericDialect {}; + + let string = "SELECT * FROM table WHERE 1 = 1"; + group.bench_function("sqlparser::select", |b| { + b.iter(|| Parser::parse_sql(&dialect, string)); + }); + + let with_query = " + WITH derived AS ( + SELECT MAX(a) AS max_a, + COUNT(b) AS b_num, + user_id + FROM TABLE + GROUP BY user_id + ) + SELECT * FROM table + LEFT JOIN derived USING (user_id) + "; + group.bench_function("sqlparser::with_select", |b| { + b.iter(|| Parser::parse_sql(&dialect, with_query)); + }); +} + +criterion_group!(benches, basic_queries); +criterion_main!(benches); diff --git a/sqlparser_bench/src/lib.rs b/sqlparser_bench/src/lib.rs new file mode 100644 index 000000000..31e1bb209 --- /dev/null +++ b/sqlparser_bench/src/lib.rs @@ -0,0 +1,7 @@ +#[cfg(test)] +mod tests { + #[test] + fn it_works() { + assert_eq!(2 + 2, 4); + } +}