Skip to content

Commit

Permalink
Add code completion benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
pfoerster committed Apr 12, 2020
1 parent f8ddb14 commit d13c550
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 57 deletions.
8 changes: 4 additions & 4 deletions benches/bench_main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
51 changes: 51 additions & 0 deletions benches/benchmarks/completion.rs
Original file line number Diff line number Diff line change
@@ -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);
}
2 changes: 2 additions & 0 deletions benches/benchmarks/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
pub mod completion;
pub mod open_bibtex;
pub mod open_latex;
mod test_data;
29 changes: 7 additions & 22 deletions benches/benchmarks/open_bibtex.rs
Original file line number Diff line number Diff line change
@@ -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);
}
51 changes: 20 additions & 31 deletions benches/benchmarks/open_latex.rs
Original file line number Diff line number Diff line change
@@ -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);
}
70 changes: 70 additions & 0 deletions benches/benchmarks/test_data.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
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)
});

0 comments on commit d13c550

Please sign in to comment.