-
Notifications
You must be signed in to change notification settings - Fork 18
(WIP) Add benchmarks comparing performance of parse functions #50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
2871b73
to
49d61b1
Compare
…hmark flamegraphs.
SummaryI couldn't find a way to expose For this query, DetailsAs I discussed with @seanlinsley on Slack, I couldn't find a way to expose You can run
|
The initial flamegraph for |
brunch::benches!( | ||
Bench::new("pg_query_parse_protobuf") | ||
.run_seeded_with(c_seed, |query| { | ||
unsafe { pg_query_parse_protobuf(query.as_ptr() as *const c_char) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It might be interesting to include the deserialization in Rust as well, so we can get a sense for where to optimize (if we were to optimize the serialization itself).
For the protobuf parse benchmark we can use the same mechanism the crate currently uses. For JSON we could (just for testing) use the mechanism that pg_parse uses (which shares a common history with this crate, but we since diverged to focus on the Protobuf format).
Probably out of scope of this PR but a cool addition would be comparisons to datafusion-sqlparser-rs |
@@ -30,3 +30,15 @@ glob = "0.3.1" | |||
easy-parallel = "3.2.0" | |||
pretty_assertions = "1.4.0" | |||
regex = "1.6.0" | |||
brunch = "0.8.*" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Crates should be ordered alphabetically. Also it's better to use 0.8
(now 0.10
) when you don't intend to pin to a patch version.
|
||
[[bench]] | ||
name = "parse_protobuf" | ||
harness = false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since the actual code in the benchmarks is so simple, I wonder if they should be merged into a single benchmark file:
use brunch::Bench;
use pg_query::bindings::*;
use std::ffi::{c_char, CString};
brunch::benches!(
Bench::new("parse_json").run_seeded_with(seed, |query| unsafe { pg_query_parse(query.as_ptr() as *const c_char) }),
Bench::new("parse_protobuf").run_seeded_with(seed, |query| unsafe { pg_query_parse_protobuf(query.as_ptr() as *const c_char) }),
Bench::new("parse_summary").run_seeded_with(seed, |query| unsafe { pg_query_parse_summary(query.as_ptr() as *const c_char, 0, 0) }),
);
fn seed() -> CString {
CString::new(build_query(100)).unwrap()
}
fn build_query(table_references: i32) -> String {
let mut query = "SELECT * FROM t".to_string();
for i in 0..table_references {
query = format!("{query} JOIN t{i} ON t.id = t{i}.t_id AND t{i}.k IN (1, 2, 3, 4) AND t{i}.f IN (SELECT o FROM p WHERE q = 'foo')");
}
query
}
Additional changes that were needed for benchmarking purposes, but may not be wanted:
pg_query_raw_parse
to the bindingspg_query::bindings