diff --git a/benches/bench_main.rs b/benches/bench_main.rs index d64f25b91..eb9b5b419 100644 --- a/benches/bench_main.rs +++ b/benches/bench_main.rs @@ -2,9 +2,9 @@ mod benchmarks; use criterion::Criterion; -#[tokio::main] -async fn main() { - benchmarks::open_latex::benches().await; - benchmarks::open_bibtex::benches().await; +fn main() { + benchmarks::completion::benches(); + benchmarks::open_bibtex::benches(); + benchmarks::open_latex::benches(); Criterion::default().configure_from_args().final_summary(); } diff --git a/benches/benchmarks/completion.rs b/benches/benchmarks/completion.rs new file mode 100644 index 000000000..6b2f95f8e --- /dev/null +++ b/benches/benchmarks/completion.rs @@ -0,0 +1,51 @@ +use super::test_data::TEST_LATEX; +use criterion::{BenchmarkId, Criterion}; +use futures::executor::block_on; +use std::time::Duration; +use texlab::{completion::CompletionProvider, feature::FeatureTester}; + +fn criterion_benchmark(criterion: &mut Criterion) { + criterion.bench_with_input( + BenchmarkId::new("Completion", "LaTeX Command"), + &TEST_LATEX, + |b, code| { + b.iter(|| { + let items = block_on(async { + FeatureTester::new() + .file("main.tex", code.as_str()) + .main("main.tex") + .position(0, 1) + .test_completion(CompletionProvider::new()) + .await + }); + assert!(!items.is_empty()); + }); + }, + ); + + criterion.bench_with_input( + BenchmarkId::new("Completion", "LaTeX Environment"), + &TEST_LATEX, + |b, code| { + b.iter(|| { + let items = block_on(async { + FeatureTester::new() + .file("main.tex", code.as_str()) + .main("main.tex") + .position(9, 9) + .test_completion(CompletionProvider::new()) + .await + }); + assert!(!items.is_empty()); + }) + }, + ); +} + +pub fn benches() { + let mut criterion = Criterion::default() + .measurement_time(Duration::from_secs(10)) + .configure_from_args(); + + criterion_benchmark(&mut criterion); +} diff --git a/benches/benchmarks/mod.rs b/benches/benchmarks/mod.rs index 8a6eb0226..d2e8b0c66 100644 --- a/benches/benchmarks/mod.rs +++ b/benches/benchmarks/mod.rs @@ -1,2 +1,4 @@ +pub mod completion; pub mod open_bibtex; pub mod open_latex; +mod test_data; diff --git a/benches/benchmarks/open_bibtex.rs b/benches/benchmarks/open_bibtex.rs index 74aaf6350..a7a485e13 100644 --- a/benches/benchmarks/open_bibtex.rs +++ b/benches/benchmarks/open_bibtex.rs @@ -1,27 +1,12 @@ +use super::test_data::TEST_BIBTEX; use criterion::Criterion; -use std::time::Duration; -use texlab::{syntax::bibtex, tex::Distribution}; -use tokio::fs; +use texlab::syntax::bibtex; -async fn criterion_benchmark(criterion: &mut Criterion) { - let distro = Distribution::detect().await; - distro - .load() - .await - .expect("failed to load TeX distribution"); - let resolver = distro.resolver().await; - let path = resolver - .files_by_name - .get("biblatex-examples.bib") - .expect("unable to retrieve biblatex-examples.bib"); - - let text = fs::read_to_string(&path).await.unwrap(); - criterion.bench_function("biblatex-examples.bib", |b| b.iter(|| bibtex::open(&text))); +fn criterion_benchmark(criterion: &mut Criterion) { + criterion.bench_function("BibTeX Parser", |b| b.iter(|| bibtex::open(&TEST_BIBTEX))); } -pub async fn benches() { - let mut criterion = Criterion::default() - .measurement_time(Duration::from_secs(20)) - .configure_from_args(); - criterion_benchmark(&mut criterion).await; +pub fn benches() { + let mut criterion = Criterion::default().configure_from_args(); + criterion_benchmark(&mut criterion); } diff --git a/benches/benchmarks/open_latex.rs b/benches/benchmarks/open_latex.rs index fbfb88aa1..603c53973 100644 --- a/benches/benchmarks/open_latex.rs +++ b/benches/benchmarks/open_latex.rs @@ -1,43 +1,32 @@ +use super::test_data::TEST_LATEX; use criterion::Criterion; -use std::{env, time::Duration}; +use std::env; use texlab::{ protocol::{Options, Uri}, syntax::latex, - tex::Distribution, + tex::Resolver, }; -use tokio::fs; -async fn criterion_benchmark(criterion: &mut Criterion) { - let distro = Distribution::detect().await; - distro - .load() - .await - .expect("failed to load TeX distribution"); - let resolver = distro.resolver().await; - let path = resolver - .files_by_name - .get("symbols.tex") - .expect("unable to retrieve symbols.tex"); - - let text = fs::read_to_string(&path).await.unwrap(); - let uri = Uri::from_file_path(&path).unwrap(); +fn criterion_benchmark(criterion: &mut Criterion) { + let uri = Uri::parse("file:///home/user/main.tex").unwrap(); + let resolver = Resolver::default(); let options = Options::default(); let cwd = env::current_dir().unwrap(); - let params = latex::OpenParams { - text: &text, - uri: &uri, - resolver: &resolver, - options: &options, - current_dir: &cwd, - }; - criterion.bench_function("symbols.tex", |b| b.iter(|| latex::open(params))); + criterion.bench_function("LaTeX Analysis", |b| { + b.iter(|| { + latex::open(latex::OpenParams { + text: &TEST_LATEX, + uri: &uri, + resolver: &resolver, + options: &options, + current_dir: &cwd, + }) + }) + }); } -pub async fn benches() { - let mut criterion = Criterion::default() - .configure_from_args() - .sample_size(15) - .measurement_time(Duration::from_secs(30)); - criterion_benchmark(&mut criterion).await; +pub fn benches() { + let mut criterion = Criterion::default().configure_from_args(); + criterion_benchmark(&mut criterion); } diff --git a/benches/benchmarks/test_data.rs b/benches/benchmarks/test_data.rs new file mode 100644 index 000000000..825b607d4 --- /dev/null +++ b/benches/benchmarks/test_data.rs @@ -0,0 +1,70 @@ +use indoc::indoc; +use once_cell::sync::Lazy; + +pub static TEST_LATEX: Lazy = Lazy::new(|| { + indoc!( + r#" + \documentclass{article} + \usepackage{amsmath} + \usepackage{lipsum} + \usepackage{geometry} + \usepackage[utf8]{inputenc} + \newcommand{\foo}{foo} + \DeclareMathOperator{\bar}{bar} + \include{child1} + \input{child2.tex} + \begin{document} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \begin{equation*}\label{eq:foo} + e^{i \pi} + 1 = 0 + \end{equation*} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \ref{eq:foo} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \section{Foo}\label{sec:foo} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \subsection{Bar}\label{sec:bar} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \include{foo} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \input{bar.tex} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \cite{foo, bar, baz} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \nocite{*} + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec fermentum lectus placerat, suscipit ligula quis. + \end{document} + "# + ) + .repeat(15) +}); + +pub static TEST_BIBTEX: Lazy = Lazy::new(|| { + r#" + @string{anch-ie = {Angew.~Chem. Int.~Ed.}} + @string{cup = {Cambridge University Press}} + @string{dtv = {Deutscher Taschenbuch-Verlag}} + @string{hup = {Harvard University Press}} + @string{jams = {J.~Amer. Math. Soc.}} + @string{jchph = {J.~Chem. Phys.}} + @string{jomch = {J.~Organomet. Chem.}} + @string{pup = {Princeton University Press}} + + @incollection{westfahl:space, + author = {Westfahl, Gary}, + title = {The True Frontier}, + subtitle = {Confronting and Avoiding the Realities of Space in {American} + Science Fiction Films}, + pages = {55-65}, + crossref = {westfahl:frontier}, + langid = {english}, + langidopts = {variant=american}, + indextitle = {True Frontier, The}, + annotation = {A cross-referenced article from a \texttt{collection}. This is + an \texttt{incollection} entry with a \texttt{crossref} + field. Note the \texttt{subtitle} and \texttt{indextitle} + fields}, + } + "# + .repeat(15) +});