Skip to content

Commit

Permalink
refactor(bench): Share code between bench/example
Browse files Browse the repository at this point in the history
  • Loading branch information
epage committed Apr 29, 2024
1 parent 7484315 commit f929325
Show file tree
Hide file tree
Showing 6 changed files with 166 additions and 242 deletions.
1 change: 1 addition & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[files]
extend-exclude = [
"crates/toml_edit/tests/fixtures/**",
"crates/benchmarks/src/Cargo.*.toml",
]

[default.extend-words]
Expand Down
4 changes: 3 additions & 1 deletion crates/benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ rust-version.workspace = true
[package.metadata.release]
release = false

[dependencies]
serde = { version = "1.0.197", features = ["derive"] }

[dev-dependencies]
toml = { path = "../toml" }
toml_edit = { path = "../toml_edit" }
toml_old = { version = "0.5.10", package = "toml" }
serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.115"
lexopt = "0.3.0"
divan = "0.1.14"
Expand Down
139 changes: 3 additions & 136 deletions crates/benchmarks/benches/cargo.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#![allow(elided_lifetimes_in_paths)]

mod toml_edit {
use super::{manifest, Data, MANIFESTS};
use toml_benchmarks::{manifest, Data, MANIFESTS};

#[divan::bench(args=MANIFESTS)]
fn document(sample: &Data) -> ::toml_edit::DocumentMut {
Expand All @@ -15,7 +15,7 @@ mod toml_edit {
}

mod toml {
use super::{manifest, Data, MANIFESTS};
use toml_benchmarks::{manifest, Data, MANIFESTS};

#[divan::bench(args=MANIFESTS)]
fn document(sample: &Data) -> ::toml::Value {
Expand All @@ -29,7 +29,7 @@ mod toml {
}

mod toml_v05 {
use super::{manifest, Data, MANIFESTS};
use toml_benchmarks::{manifest, Data, MANIFESTS};

#[divan::bench(args=MANIFESTS)]
fn document(sample: &Data) -> ::toml_old::Value {
Expand All @@ -45,136 +45,3 @@ mod toml_v05 {
fn main() {
divan::main();
}

#[derive(Debug)]
pub struct Data(&'static str, &'static str);

impl Data {
pub const fn name(&self) -> &'static str {
self.0
}

pub const fn content(&self) -> &'static str {
self.1
}
}

impl std::fmt::Display for Data {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.name().fmt(f)
}
}

const MANIFESTS: &[Data] = &[Data("0-minimal", MINIMAL), Data("1-medium", MEDIUM)];

const MINIMAL: &str = r#"
[package]
name = "bar"
version = "0.1.0"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
"#;

const MEDIUM: &str = include_str!("Cargo.cargo.toml");

mod manifest {
use std::collections::HashMap;

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Manifest {
package: Package,
#[serde(default)]
lib: Option<Lib>,
#[serde(default)]
bin: Vec<Bin>,
#[serde(default)]
features: HashMap<String, Vec<String>>,
#[serde(default)]
dependencies: HashMap<String, Dependency>,
#[serde(default)]
build_dependencies: HashMap<String, Dependency>,
#[serde(default)]
dev_dependencies: HashMap<String, Dependency>,
#[serde(default)]
target: HashMap<String, Target>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Package {
name: String,
version: String,
#[serde(default)]
edition: Option<String>,
#[serde(default)]
authors: Vec<String>,
#[serde(default)]
license: Option<String>,
#[serde(default)]
homepage: Option<String>,
#[serde(default)]
repository: Option<String>,
#[serde(default)]
documentation: Option<String>,
#[serde(default)]
readme: Option<String>,
#[serde(default)]
description: Option<String>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Lib {
name: String,
#[serde(default)]
path: Option<String>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Bin {
name: String,
#[serde(default)]
test: bool,
#[serde(default)]
doc: bool,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
#[serde(untagged)]
pub(crate) enum Dependency {
Version(String),
Full(DependencyFull),
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct DependencyFull {
#[serde(default)]
version: Option<String>,
#[serde(default)]
path: Option<String>,
#[serde(default)]
default_features: bool,
#[serde(default)]
optional: bool,
#[serde(default)]
features: Vec<String>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Target {
#[serde(default)]
dependencies: HashMap<String, Dependency>,
#[serde(default)]
build_dependencies: HashMap<String, Dependency>,
#[serde(default)]
dev_dependencies: HashMap<String, Dependency>,
}
}
132 changes: 27 additions & 105 deletions crates/benchmarks/examples/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,22 @@ fn main() -> Result<(), lexopt::Error> {

match args.parser {
Parser::Document => {
let _doc = CARGO_MANIFEST.parse::<toml_edit::DocumentMut>().unwrap();
let _doc = args
.data
.content()
.parse::<toml_edit::DocumentMut>()
.unwrap();
#[cfg(debug_assertions)] // Don't interefere with profiling
drop(_doc);
}
Parser::De => {
let _doc = toml::from_str::<manifest::Manifest>(CARGO_MANIFEST).unwrap();
let _doc =
toml::from_str::<toml_benchmarks::manifest::Manifest>(args.data.content()).unwrap();
#[cfg(debug_assertions)] // Don't interefere with profiling
drop(_doc);
}
Parser::Table => {
let _doc = CARGO_MANIFEST.parse::<toml::Table>().unwrap();
let _doc = args.data.content().parse::<toml::Table>().unwrap();
#[cfg(debug_assertions)] // Don't interefere with profiling
drop(_doc);
}
Expand All @@ -23,6 +28,7 @@ fn main() -> Result<(), lexopt::Error> {

struct Args {
parser: Parser,
data: toml_benchmarks::Data,
}

impl Args {
Expand All @@ -32,6 +38,10 @@ impl Args {
let mut parser = Parser::Document;

let mut args = lexopt::Parser::from_env();
let mut data = toml_benchmarks::MANIFESTS
.iter()
.find(|d| d.name() == "1-medium")
.unwrap();
while let Some(arg) = args.next()? {
match arg {
Long("parser") => {
Expand All @@ -48,11 +58,24 @@ impl Args {
}
};
}
Long("manifest") => {
let name = args.value()?;
data = toml_benchmarks::MANIFESTS
.iter()
.find(|d| d.name() == name)
.ok_or_else(|| lexopt::Error::UnexpectedValue {
option: "manifest".to_owned(),
value: name.clone(),
})?;
}
_ => return Err(arg.unexpected()),
}
}

Ok(Self { parser })
Ok(Self {
parser,
data: *data,
})
}
}

Expand All @@ -61,104 +84,3 @@ enum Parser {
De,
Table,
}

mod manifest {
use std::collections::HashMap;

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Manifest {
package: Package,
#[serde(default)]
lib: Option<Lib>,
#[serde(default)]
bin: Vec<Bin>,
#[serde(default)]
features: HashMap<String, Vec<String>>,
#[serde(default)]
dependencies: HashMap<String, Dependency>,
#[serde(default)]
build_dependencies: HashMap<String, Dependency>,
#[serde(default)]
dev_dependencies: HashMap<String, Dependency>,
#[serde(default)]
target: HashMap<String, Target>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Package {
name: String,
version: String,
#[serde(default)]
edition: Option<String>,
#[serde(default)]
authors: Vec<String>,
#[serde(default)]
license: Option<String>,
#[serde(default)]
homepage: Option<String>,
#[serde(default)]
repository: Option<String>,
#[serde(default)]
documentation: Option<String>,
#[serde(default)]
readme: Option<String>,
#[serde(default)]
description: Option<String>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Lib {
name: String,
#[serde(default)]
path: Option<String>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Bin {
name: String,
#[serde(default)]
test: bool,
#[serde(default)]
doc: bool,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
#[serde(untagged)]
pub(crate) enum Dependency {
Version(String),
Full(DependencyFull),
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct DependencyFull {
#[serde(default)]
version: Option<String>,
#[serde(default)]
path: Option<String>,
#[serde(default)]
default_features: bool,
#[serde(default)]
optional: bool,
#[serde(default)]
features: Vec<String>,
}

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Target {
#[serde(default)]
dependencies: HashMap<String, Dependency>,
#[serde(default)]
build_dependencies: HashMap<String, Dependency>,
#[serde(default)]
dev_dependencies: HashMap<String, Dependency>,
}
}

const CARGO_MANIFEST: &str = include_str!("../benches/Cargo.cargo.toml");
File renamed without changes.
Loading

0 comments on commit f929325

Please sign in to comment.