Fork of https://github.com/oxigraph/oxigraph.git for the purpose of NextGraph project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
oxigraph/testsuite/benches/parser.rs

197 lines
5.0 KiB

#![allow(clippy::print_stderr)]
use anyhow::Result;
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use oxigraph_testsuite::files::read_file;
use oxigraph_testsuite::manifest::TestManifest;
use rio_api::parser::*;
use rio_turtle::*;
use std::io::Read;
fn test_data_from_testsuite(manifest_uri: String, include_tests_types: &[&str]) -> Result<Vec<u8>> {
let manifest = TestManifest::new([manifest_uri]);
let mut data = Vec::default();
for test in manifest {
let test = test?;
if include_tests_types.contains(&test.kind.as_str()) {
read_file(&test.action.unwrap())?.read_to_end(&mut data)?;
data.push(b'\n');
}
}
Ok(data)
}
fn ntriples_test_data() -> Result<Vec<u8>> {
test_data_from_testsuite(
"http://w3c.github.io/rdf-tests/ntriples/manifest.ttl".to_owned(),
&["http://www.w3.org/ns/rdftest#TestNTriplesPositiveSyntax"],
)
}
fn turtle_test_data() -> Result<Vec<u8>> {
test_data_from_testsuite(
"http://w3c.github.io/rdf-tests/turtle/manifest.ttl".to_owned(),
&[
"http://www.w3.org/ns/rdftest#TestTurtlePositiveSyntax",
"http://www.w3.org/ns/rdftest#TestTurtleEval",
],
)
}
fn parse_bench(
c: &mut Criterion,
parser_name: &str,
data_name: &str,
data: &[u8],
bench: impl Fn(&[u8]),
) {
let mut group = c.benchmark_group(parser_name);
group.throughput(Throughput::Bytes(data.len() as u64));
group.bench_with_input(BenchmarkId::from_parameter(data_name), &data, |b, data| {
b.iter(|| bench(data))
});
group.finish();
}
fn parse_oxttl_ntriples(c: &mut Criterion, name: &str, data: &[u8]) {
parse_bench(c, "oxttl ntriples", name, data, |data| {
let mut parser = oxttl::NTriplesParser::new().parse();
parser.extend_from_slice(data);
parser.end();
while let Some(result) = parser.read_next() {
result.unwrap();
}
});
}
fn parse_oxttl_turtle(c: &mut Criterion, name: &str, data: &[u8]) {
parse_bench(c, "oxttl turtle", name, data, |data| {
let mut parser = oxttl::TurtleParser::new().parse();
parser.extend_from_slice(data);
parser.end();
while let Some(result) = parser.read_next() {
result.unwrap();
}
});
}
fn parse_rio_ntriples(c: &mut Criterion, name: &str, data: &[u8]) {
parse_bench(c, "rio ntriples", name, data, |data| {
let mut count: u64 = 0;
NTriplesParser::new(data)
.parse_all::<TurtleError>(&mut |_| {
count += 1;
Ok(())
})
.unwrap();
});
}
fn parse_rio_turtle(c: &mut Criterion, name: &str, data: &[u8]) {
parse_bench(c, "rio turtle", name, data, |data| {
let mut count: u64 = 0;
TurtleParser::new(data, None)
.parse_all::<TurtleError>(&mut |_| {
count += 1;
Ok(())
})
.unwrap();
});
}
fn bench_parse_oxttl_ntriples_with_ntriples(c: &mut Criterion) {
parse_oxttl_ntriples(
c,
"ntriples",
&match ntriples_test_data() {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
},
)
}
fn bench_parse_oxttl_ntriples_with_turtle(c: &mut Criterion) {
parse_oxttl_turtle(
c,
"ntriples",
&match ntriples_test_data() {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
},
)
}
fn bench_parse_oxttl_turtle_with_turtle(c: &mut Criterion) {
parse_oxttl_turtle(
c,
"turtle",
&match turtle_test_data() {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
},
)
}
fn bench_parse_rio_ntriples_with_ntriples(c: &mut Criterion) {
parse_rio_ntriples(
c,
"ntriples",
&match ntriples_test_data() {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
},
)
}
fn bench_parse_rio_ntriples_with_turtle(c: &mut Criterion) {
parse_rio_turtle(
c,
"ntriples",
&match ntriples_test_data() {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
},
)
}
fn bench_parse_rio_turtle_with_turtle(c: &mut Criterion) {
parse_rio_turtle(
c,
"turtle",
&match turtle_test_data() {
Ok(d) => d,
Err(e) => {
eprintln!("{e}");
return;
}
},
)
}
criterion_group!(
w3c_testsuite,
bench_parse_rio_ntriples_with_ntriples,
bench_parse_rio_ntriples_with_turtle,
bench_parse_rio_turtle_with_turtle,
bench_parse_oxttl_ntriples_with_ntriples,
bench_parse_oxttl_ntriples_with_turtle,
bench_parse_oxttl_turtle_with_turtle
);
criterion_main!(w3c_testsuite);