Refactor benchmarks

This commit is contained in:
Patrick Förster 2020-05-17 16:10:31 +02:00
parent ebda917625
commit d4ba24e217
6 changed files with 85 additions and 139 deletions

View file

@ -1,10 +1,7 @@
mod benchmarks;
use criterion::Criterion;
use criterion::criterion_main;
fn main() {
benchmarks::completion::benches();
benchmarks::open_bibtex::benches();
benchmarks::open_latex::benches();
Criterion::default().configure_from_args().final_summary();
criterion_main! {
benchmarks::completion::benches
}

View file

@ -1,51 +1,117 @@
use super::test_data::TEST_LATEX;
use criterion::criterion_group;
use criterion::{BenchmarkId, Criterion};
use futures::executor::block_on;
use indoc::indoc;
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,
BenchmarkId::new("Completion", "LaTeX Word"),
&LATEX_CODE,
|b, code| {
b.iter(|| {
let items = block_on(async {
block_on(async {
FeatureTester::new()
.file("main.tex", code.as_str())
.file("main.tex", *code)
.main("main.tex")
.position(0, 0)
.test_completion(CompletionProvider::new())
.await
});
});
},
);
criterion.bench_with_input(
BenchmarkId::new("Completion", "LaTeX Command"),
&LATEX_CODE,
|b, code| {
b.iter(|| {
block_on(async {
FeatureTester::new()
.file("main.tex", *code)
.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,
&LATEX_CODE,
|b, code| {
b.iter(|| {
let items = block_on(async {
block_on(async {
FeatureTester::new()
.file("main.tex", code.as_str())
.file("main.tex", *code)
.main("main.tex")
.position(9, 9)
.test_completion(CompletionProvider::new())
.await
});
assert!(!items.is_empty());
})
},
);
criterion.bench_with_input(
BenchmarkId::new("Completion", "LaTeX Label"),
&LATEX_CODE,
|b, code| {
b.iter(|| {
block_on(async {
FeatureTester::new()
.file("main.tex", *code)
.main("main.tex")
.position(15, 7)
.test_completion(CompletionProvider::new())
.await
});
})
},
);
}
pub fn benches() {
let mut criterion = Criterion::default()
.measurement_time(Duration::from_secs(10))
.configure_from_args();
criterion_benchmark(&mut criterion);
criterion_group! {
name = benches;
config = Criterion::default().measurement_time(Duration::from_secs(60));
targets = criterion_benchmark
}
static LATEX_CODE: &str = 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}
"#
);

View file

@ -1,4 +1 @@
pub mod completion;
pub mod open_bibtex;
pub mod open_latex;
mod test_data;

View file

@ -1,12 +0,0 @@
use super::test_data::TEST_BIBTEX;
use criterion::Criterion;
use texlab::syntax::bibtex;
fn criterion_benchmark(criterion: &mut Criterion) {
criterion.bench_function("BibTeX Parser", |b| b.iter(|| bibtex::open(&TEST_BIBTEX)));
}
pub fn benches() {
let mut criterion = Criterion::default().configure_from_args();
criterion_benchmark(&mut criterion);
}

View file

@ -1,32 +0,0 @@
use super::test_data::TEST_LATEX;
use criterion::Criterion;
use std::env;
use texlab::{
protocol::{Options, Uri},
syntax::latex,
tex::Resolver,
};
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();
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 fn benches() {
let mut criterion = Criterion::default().configure_from_args();
criterion_benchmark(&mut criterion);
}

View file

@ -1,70 +0,0 @@
use indoc::indoc;
use once_cell::sync::Lazy;
pub static TEST_LATEX: Lazy<String> = 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<String> = 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)
});