Skip to content

Commit

Permalink
Merge pull request #721 from epage/bench
Browse files Browse the repository at this point in the history
test(bench): Check with many features
  • Loading branch information
epage committed Apr 29, 2024
2 parents 6bf84fc + e291b36 commit 9eda40a
Show file tree
Hide file tree
Showing 7 changed files with 1,952 additions and 480 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
293 changes: 37 additions & 256 deletions crates/benchmarks/benches/cargo.rs
Original file line number Diff line number Diff line change
@@ -1,298 +1,79 @@
#![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 {
fn document(sample: &Data<'static>) -> ::toml_edit::DocumentMut {
sample.content().parse().unwrap()
}

#[divan::bench(args=MANIFESTS)]
fn manifest(sample: &Data) -> manifest::Manifest {
fn manifest(sample: &Data<'static>) -> manifest::Manifest {
::toml_edit::de::from_str(sample.content()).unwrap()
}
}

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

#[divan::bench(args=MANIFESTS)]
fn document(sample: &Data) -> ::toml::Value {
fn document(sample: &Data<'static>) -> ::toml::Value {
sample.content().parse().unwrap()
}

#[divan::bench(args=MANIFESTS)]
fn manifest(sample: &Data) -> manifest::Manifest {
fn manifest(sample: &Data<'static>) -> manifest::Manifest {
::toml::de::from_str(sample.content()).unwrap()
}
}

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 {
fn document(sample: &Data<'static>) -> ::toml_old::Value {
sample.content().parse().unwrap()
}

#[divan::bench(args=MANIFESTS)]
fn manifest(sample: &Data) -> manifest::Manifest {
fn manifest(sample: &Data<'static>) -> manifest::Manifest {
::toml_old::de::from_str(sample.content()).unwrap()
}
}

fn main() {
divan::main();
}

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

impl Data {
pub const fn name(&self) -> &'static str {
self.0
}
mod serde_json {
use toml_benchmarks::{manifest, Data, MANIFESTS};

pub const fn content(&self) -> &'static str {
self.1
#[divan::bench(args=MANIFESTS)]
fn document(bencher: divan::Bencher, sample: &Data) {
let value = toml_edit::de::from_str::<serde_json::Value>(sample.content()).unwrap();
let json = serde_json::to_string_pretty(&value).unwrap();
bencher
.with_inputs(|| {
let sample = Data(sample.name(), &json);
sample
})
.bench_values(|sample| {
serde_json::from_str::<::toml::Value>(sample.content()).unwrap()
});
}
}

impl std::fmt::Display for Data {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.name().fmt(f)
#[divan::bench(args=MANIFESTS)]
fn manifest(bencher: divan::Bencher, sample: &Data) {
let value = toml_edit::de::from_str::<serde_json::Value>(sample.content()).unwrap();
let json = serde_json::to_string_pretty(&value).unwrap();
bencher
.with_inputs(|| {
let sample = Data(sample.name(), &json);
sample
})
.bench_values(|sample| {
serde_json::from_str::<manifest::Manifest>(sample.content()).unwrap()
});
}
}

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 = r#"
[package]
name = "cargo"
version = "0.57.0"
edition = "2018"
authors = ["Yehuda Katz <wycats@gmail.com>",
"Carl Lerche <me@carllerche.com>",
"Alex Crichton <alex@alexcrichton.com>"]
license = "MIT OR Apache-2.0"
homepage = "https://crates.io"
repository = "https://github.com/rust-lang/cargo"
documentation = "https://docs.rs/cargo"
readme = "README.md"
description = """
Cargo, a package manager for Rust.
"""
[lib]
name = "cargo"
path = "src/cargo/lib.rs"
[dependencies]
atty = "0.2"
bytesize = "1.0"
cargo-platform = { path = "crates/cargo-platform", version = "0.1.2" }
cargo-util = { path = "crates/cargo-util", version = "0.1.1" }
crates-io = { path = "crates/crates-io", version = "0.33.0" }
crossbeam-utils = "0.8"
curl = { version = "0.4.38", features = ["http2"] }
curl-sys = "0.4.45"
env_logger = "0.9.0"
pretty_env_logger = { version = "0.4", optional = true }
anyhow = "1.0"
filetime = "0.2.9"
flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] }
git2 = "0.13.16"
git2-curl = "0.14.1"
glob = "0.3.0"
hex = "0.4"
home = "0.5"
humantime = "2.0.0"
ignore = "0.4.7"
lazy_static = "1.2.0"
jobserver = "0.1.24"
lazycell = "1.2.0"
libc = "0.2"
log = "0.4.6"
libgit2-sys = "0.12.18"
memchr = "2.1.3"
num_cpus = "1.0"
opener = "0.5"
percent-encoding = "2.0"
rustfix = "0.6.0"
semver = { version = "1.0.3", features = ["serde"] }
serde = { version = "1.0.123", features = ["derive"] }
serde_ignored = "0.1.0"
serde_json = { version = "1.0.30", features = ["raw_value"] }
shell-escape = "0.1.4"
strip-ansi-escapes = "0.1.0"
tar = { version = "0.4.35", default-features = false }
tempfile = "3.0"
termcolor = "1.1"
toml = "0.5.7"
unicode-xid = "0.2.0"
url = "2.2.2"
walkdir = "2.2"
clap = "2.31.2"
unicode-width = "0.1.5"
openssl = { version = '0.10.11', optional = true }
im-rc = "15.0.0"
itertools = "0.10.0"
# A noop dependency that changes in the Rust repository, it's a bit of a hack.
# See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust`
# for more information.
rustc-workspace-hack = "1.0.0"
[target.'cfg(windows)'.dependencies]
fwdansi = "1.1.0"
[target.'cfg(windows)'.dependencies.winapi]
version = "0.3"
features = [
"basetsd",
"handleapi",
"jobapi",
"jobapi2",
"memoryapi",
"minwindef",
"ntdef",
"ntstatus",
"processenv",
"processthreadsapi",
"psapi",
"synchapi",
"winerror",
"winbase",
"wincon",
"winnt",
]
[dev-dependencies]
cargo-test-macro = { path = "crates/cargo-test-macro" }
cargo-test-support = { path = "crates/cargo-test-support" }
[build-dependencies]
flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] }
tar = { version = "0.4.26", default-features = false }
[[bin]]
name = "cargo"
test = false
doc = false
[features]
deny-warnings = []
vendored-openssl = ["openssl/vendored"]
pretty-env-logger = ["pretty_env_logger"]
"#;

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>,
}
fn main() {
divan::main();
}

0 comments on commit 9eda40a

Please sign in to comment.