From 42962da0a51896d4d05d714dd01671a427e170e3 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Fri, 17 Jun 2022 12:20:23 -0500 Subject: [PATCH 1/2] refactor parts of benchsuite/resolve.rs to a library, so it can be used by other benchmarks --- benches/benchsuite/Cargo.toml | 3 + benches/benchsuite/benches/resolve.rs | 203 ++------------------------ benches/benchsuite/src/lib.rs | 197 +++++++++++++++++++++++++ 3 files changed, 211 insertions(+), 192 deletions(-) create mode 100644 benches/benchsuite/src/lib.rs diff --git a/benches/benchsuite/Cargo.toml b/benches/benchsuite/Cargo.toml index c16f4f86646..6525db90ced 100644 --- a/benches/benchsuite/Cargo.toml +++ b/benches/benchsuite/Cargo.toml @@ -16,6 +16,9 @@ flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] } tar = { version = "0.4.38", default-features = false } url = "2.2.2" +[lib] +bench = false + [[bench]] name = "resolve" harness = false diff --git a/benches/benchsuite/benches/resolve.rs b/benches/benchsuite/benches/resolve.rs index 84455232eb9..d03cd620e27 100644 --- a/benches/benchsuite/benches/resolve.rs +++ b/benches/benchsuite/benches/resolve.rs @@ -1,145 +1,12 @@ +use benchsuite::fixtures; use cargo::core::compiler::{CompileKind, RustcTargetData}; -use cargo::core::resolver::features::{CliFeatures, FeatureOpts, FeatureResolver, ForceAllTargets}; -use cargo::core::resolver::{HasDevUnits, ResolveBehavior}; +use cargo::core::resolver::features::{FeatureOpts, FeatureResolver}; +use cargo::core::resolver::{CliFeatures, ForceAllTargets, HasDevUnits, ResolveBehavior}; use cargo::core::{PackageIdSpec, Workspace}; use cargo::ops::WorkspaceResolve; use cargo::Config; use criterion::{criterion_group, criterion_main, Criterion}; -use std::fs; -use std::path::{Path, PathBuf}; -use std::process::Command; -use url::Url; - -// This is an arbitrary commit that existed when I started. This helps -// ensure consistent results. It can be updated if needed, but that can -// make it harder to compare results with older versions of cargo. -const CRATES_IO_COMMIT: &str = "85f7bfd61ea4fee08ec68c468762e886b2aebec6"; - -fn setup() { - create_home(); - create_target_dir(); - clone_index(); - unpack_workspaces(); -} - -fn root() -> PathBuf { - let mut p = PathBuf::from(env!("CARGO_TARGET_TMPDIR")); - p.push("bench"); - p -} - -fn target_dir() -> PathBuf { - let mut p = root(); - p.push("target"); - p -} - -fn cargo_home() -> PathBuf { - let mut p = root(); - p.push("chome"); - p -} - -fn index() -> PathBuf { - let mut p = root(); - p.push("index"); - p -} - -fn workspaces_path() -> PathBuf { - let mut p = root(); - p.push("workspaces"); - p -} - -fn registry_url() -> Url { - Url::from_file_path(index()).unwrap() -} - -fn create_home() { - let home = cargo_home(); - if !home.exists() { - fs::create_dir_all(&home).unwrap(); - } - fs::write( - home.join("config.toml"), - format!( - r#" - [source.crates-io] - replace-with = 'local-snapshot' - - [source.local-snapshot] - registry = '{}' - "#, - registry_url() - ), - ) - .unwrap(); -} - -fn create_target_dir() { - // This is necessary to ensure the .rustc_info.json file is written. - // Otherwise it won't be written, and it is very expensive to create. - if !target_dir().exists() { - std::fs::create_dir_all(target_dir()).unwrap(); - } -} - -/// This clones crates.io at a specific point in time into tmp/index. -fn clone_index() { - let index = index(); - let maybe_git = |command: &str| { - let status = Command::new("git") - .current_dir(&index) - .args(command.split_whitespace().collect::>()) - .status() - .expect("git should be installed"); - status.success() - }; - let git = |command: &str| { - if !maybe_git(command) { - panic!("failed to run git command: {}", command); - } - }; - if index.exists() { - if maybe_git(&format!( - "rev-parse -q --verify {}^{{commit}}", - CRATES_IO_COMMIT - )) { - // Already fetched. - return; - } - } else { - fs::create_dir_all(&index).unwrap(); - git("init --bare"); - git("remote add origin https://github.com/rust-lang/crates.io-index"); - } - git(&format!("fetch origin {}", CRATES_IO_COMMIT)); - git("branch -f master FETCH_HEAD"); -} - -/// This unpacks the compressed workspace skeletons into tmp/workspaces. -fn unpack_workspaces() { - let ws_dir = Path::new(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .join("workspaces"); - let archives = fs::read_dir(ws_dir) - .unwrap() - .map(|e| e.unwrap().path()) - .filter(|p| p.extension() == Some(std::ffi::OsStr::new("tgz"))); - for archive in archives { - let name = archive.file_stem().unwrap(); - let f = fs::File::open(&archive).unwrap(); - let f = flate2::read::GzDecoder::new(f); - let dest = workspaces_path().join(&name); - if dest.exists() { - fs::remove_dir_all(&dest).unwrap(); - } - let mut archive = tar::Archive::new(f); - archive.unpack(workspaces_path()).unwrap(); - } -} +use std::path::Path; struct ResolveInfo<'cfg> { ws: Workspace<'cfg>, @@ -152,36 +19,12 @@ struct ResolveInfo<'cfg> { ws_resolve: WorkspaceResolve<'cfg>, } -/// Vec of `(ws_name, ws_root)`. -fn workspaces() -> Vec<(String, PathBuf)> { - // CARGO_BENCH_WORKSPACES can be used to override, otherwise it just uses - // the workspaces in the workspaces directory. - let mut ps: Vec<_> = match std::env::var_os("CARGO_BENCH_WORKSPACES") { - Some(s) => std::env::split_paths(&s).collect(), - None => fs::read_dir(workspaces_path()) - .unwrap() - .map(|e| e.unwrap().path()) - // These currently fail in most cases on Windows due to long - // filenames in the git checkouts. - .filter(|p| { - !(cfg!(windows) - && matches!(p.file_name().unwrap().to_str().unwrap(), "servo" | "tikv")) - }) - .collect(), - }; - // Sort so it is consistent. - ps.sort(); - ps.into_iter() - .map(|p| (p.file_name().unwrap().to_str().unwrap().to_owned(), p)) - .collect() -} - /// Helper for resolving a workspace. This will run the resolver once to /// download everything, and returns all the data structures that are used /// during resolution. fn do_resolve<'cfg>(config: &'cfg Config, ws_root: &Path) -> ResolveInfo<'cfg> { let requested_kinds = [CompileKind::Host]; - let ws = cargo::core::Workspace::new(&ws_root.join("Cargo.toml"), config).unwrap(); + let ws = Workspace::new(&ws_root.join("Cargo.toml"), config).unwrap(); let target_data = RustcTargetData::new(&ws, &requested_kinds).unwrap(); let cli_features = CliFeatures::from_command_line(&[], false, true).unwrap(); let pkgs = cargo::ops::Packages::Default; @@ -212,38 +55,14 @@ fn do_resolve<'cfg>(config: &'cfg Config, ws_root: &Path) -> ResolveInfo<'cfg> { } } -/// Creates a new Config. -/// -/// This is separate from `do_resolve` to deal with the ownership and lifetime. -fn make_config(ws_root: &Path) -> Config { - let shell = cargo::core::Shell::new(); - let mut config = cargo::util::Config::new(shell, ws_root.to_path_buf(), cargo_home()); - // Configure is needed to set the target_dir which is needed to write - // the .rustc_info.json file which is very expensive. - config - .configure( - 0, - false, - None, - false, - false, - false, - &Some(target_dir()), - &[], - &[], - ) - .unwrap(); - config -} - /// Benchmark of the full `resolve_ws_with_opts` which runs the resolver /// twice, the feature resolver, and more. This is a major component of a /// regular cargo build. fn resolve_ws(c: &mut Criterion) { - setup(); + let fixtures = fixtures!(); let mut group = c.benchmark_group("resolve_ws"); - for (ws_name, ws_root) in workspaces() { - let config = make_config(&ws_root); + for (ws_name, ws_root) in fixtures.workspaces() { + let config = fixtures.make_config(&ws_root); // The resolver info is initialized only once in a lazy fashion. This // allows criterion to skip this workspace if the user passes a filter // on the command-line (like `cargo bench -- resolve_ws/tikv`). @@ -282,10 +101,10 @@ fn resolve_ws(c: &mut Criterion) { /// Benchmark of the feature resolver. fn feature_resolver(c: &mut Criterion) { - setup(); + let fixtures = fixtures!(); let mut group = c.benchmark_group("feature_resolver"); - for (ws_name, ws_root) in workspaces() { - let config = make_config(&ws_root); + for (ws_name, ws_root) in fixtures.workspaces() { + let config = fixtures.make_config(&ws_root); let mut lazy_info = None; group.bench_function(&ws_name, |b| { let ResolveInfo { diff --git a/benches/benchsuite/src/lib.rs b/benches/benchsuite/src/lib.rs new file mode 100644 index 00000000000..42e0f513c26 --- /dev/null +++ b/benches/benchsuite/src/lib.rs @@ -0,0 +1,197 @@ +use cargo::Config; +use std::fs; +use std::path::{Path, PathBuf}; +use std::process::Command; +use url::Url; + +#[macro_export] +macro_rules! fixtures { + () => { + $crate::Fixtures::new(env!("CARGO_TARGET_TMPDIR")) + }; +} + +// This is an arbitrary commit that existed when I started. This helps +// ensure consistent results. It can be updated if needed, but that can +// make it harder to compare results with older versions of cargo. +const CRATES_IO_COMMIT: &str = "85f7bfd61ea4fee08ec68c468762e886b2aebec6"; + +pub struct Fixtures { + cargo_target_tmpdir: PathBuf, +} + +impl Fixtures { + pub fn new(cargo_target_tmpdir: &str) -> Self { + let bench = Self { + cargo_target_tmpdir: PathBuf::from(cargo_target_tmpdir), + }; + bench.create_home(); + bench.create_target_dir(); + bench.clone_index(); + bench.unpack_workspaces(); + bench + } + + fn root(&self) -> PathBuf { + self.cargo_target_tmpdir.join("bench") + } + + fn target_dir(&self) -> PathBuf { + let mut p = self.root(); + p.push("target"); + p + } + + fn cargo_home(&self) -> PathBuf { + let mut p = self.root(); + p.push("chome"); + p + } + + fn index(&self) -> PathBuf { + let mut p = self.root(); + p.push("index"); + p + } + + fn workspaces_path(&self) -> PathBuf { + let mut p = self.root(); + p.push("workspaces"); + p + } + + fn registry_url(&self) -> Url { + Url::from_file_path(self.index()).unwrap() + } + + fn create_home(&self) { + let home = self.cargo_home(); + if !home.exists() { + fs::create_dir_all(&home).unwrap(); + } + fs::write( + home.join("config.toml"), + format!( + r#" + [source.crates-io] + replace-with = 'local-snapshot' + + [source.local-snapshot] + registry = '{}' + "#, + self.registry_url() + ), + ) + .unwrap(); + } + + fn create_target_dir(&self) { + // This is necessary to ensure the .rustc_info.json file is written. + // Otherwise it won't be written, and it is very expensive to create. + if !self.target_dir().exists() { + fs::create_dir_all(self.target_dir()).unwrap(); + } + } + + /// This clones crates.io at a specific point in time into tmp/index. + fn clone_index(&self) { + let index = self.index(); + let maybe_git = |command: &str| { + let status = Command::new("git") + .current_dir(&index) + .args(command.split_whitespace().collect::>()) + .status() + .expect("git should be installed"); + status.success() + }; + let git = |command: &str| { + if !maybe_git(command) { + panic!("failed to run git command: {}", command); + } + }; + if index.exists() { + if maybe_git(&format!( + "rev-parse -q --verify {}^{{commit}}", + CRATES_IO_COMMIT + )) { + // Already fetched. + return; + } + } else { + fs::create_dir_all(&index).unwrap(); + git("init --bare"); + git("remote add origin https://github.com/rust-lang/crates.io-index"); + } + git(&format!("fetch origin {}", CRATES_IO_COMMIT)); + git("branch -f master FETCH_HEAD"); + } + + /// This unpacks the compressed workspace skeletons into tmp/workspaces. + fn unpack_workspaces(&self) { + let ws_dir = Path::new(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .join("workspaces"); + let archives = fs::read_dir(ws_dir) + .unwrap() + .map(|e| e.unwrap().path()) + .filter(|p| p.extension() == Some(std::ffi::OsStr::new("tgz"))); + for archive in archives { + let name = archive.file_stem().unwrap(); + let f = fs::File::open(&archive).unwrap(); + let f = flate2::read::GzDecoder::new(f); + let dest = self.workspaces_path().join(&name); + if dest.exists() { + fs::remove_dir_all(&dest).unwrap(); + } + let mut archive = tar::Archive::new(f); + archive.unpack(self.workspaces_path()).unwrap(); + } + } + + /// Vec of `(ws_name, ws_root)`. + pub fn workspaces(&self) -> Vec<(String, PathBuf)> { + // CARGO_BENCH_WORKSPACES can be used to override, otherwise it just uses + // the workspaces in the workspaces directory. + let mut ps: Vec<_> = match std::env::var_os("CARGO_BENCH_WORKSPACES") { + Some(s) => std::env::split_paths(&s).collect(), + None => fs::read_dir(self.workspaces_path()) + .unwrap() + .map(|e| e.unwrap().path()) + // These currently fail in most cases on Windows due to long + // filenames in the git checkouts. + .filter(|p| { + !(cfg!(windows) + && matches!(p.file_name().unwrap().to_str().unwrap(), "servo" | "tikv")) + }) + .collect(), + }; + // Sort so it is consistent. + ps.sort(); + ps.into_iter() + .map(|p| (p.file_name().unwrap().to_str().unwrap().to_owned(), p)) + .collect() + } + + /// Creates a new Config. + pub fn make_config(&self, ws_root: &Path) -> Config { + let shell = cargo::core::Shell::new(); + let mut config = Config::new(shell, ws_root.to_path_buf(), self.cargo_home()); + // Configure is needed to set the target_dir which is needed to write + // the .rustc_info.json file which is very expensive. + config + .configure( + 0, + false, + None, + false, + false, + false, + &Some(self.target_dir()), + &[], + &[], + ) + .unwrap(); + config + } +} From f182411a8e2be5ead48c01d953696a01fc5de09f Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Fri, 17 Jun 2022 13:16:56 -0500 Subject: [PATCH 2/2] add a bench for workspace initialization --- benches/benchsuite/Cargo.toml | 5 ++++ .../benches/workspace_initialization.rs | 27 ++++++++++++++++++ benches/workspaces/rust-ws-inherit.tgz | Bin 0 -> 45123 bytes 3 files changed, 32 insertions(+) create mode 100644 benches/benchsuite/benches/workspace_initialization.rs create mode 100644 benches/workspaces/rust-ws-inherit.tgz diff --git a/benches/benchsuite/Cargo.toml b/benches/benchsuite/Cargo.toml index 6525db90ced..59776da2461 100644 --- a/benches/benchsuite/Cargo.toml +++ b/benches/benchsuite/Cargo.toml @@ -10,6 +10,7 @@ description = "Benchmarking suite for Cargo." [dependencies] cargo = { path = "../.." } +cargo-test-support = { path = "../../crates/cargo-test-support" } # Consider removing html_reports in 0.4 and switching to `cargo criterion`. criterion = { version = "0.3.5", features = ["html_reports"] } flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] } @@ -22,3 +23,7 @@ bench = false [[bench]] name = "resolve" harness = false + +[[bench]] +name = "workspace_initialization" +harness = false diff --git a/benches/benchsuite/benches/workspace_initialization.rs b/benches/benchsuite/benches/workspace_initialization.rs new file mode 100644 index 00000000000..af68efe76ce --- /dev/null +++ b/benches/benchsuite/benches/workspace_initialization.rs @@ -0,0 +1,27 @@ +use benchsuite::fixtures; +use cargo::core::Workspace; +use criterion::{criterion_group, criterion_main, Criterion}; + +fn workspace_initialization(c: &mut Criterion) { + let fixtures = fixtures!(); + let mut group = c.benchmark_group("workspace_initialization"); + for (ws_name, ws_root) in fixtures.workspaces() { + let config = fixtures.make_config(&ws_root); + // The resolver info is initialized only once in a lazy fashion. This + // allows criterion to skip this workspace if the user passes a filter + // on the command-line (like `cargo bench -- workspace_initialization/tikv`). + group.bench_function(ws_name, |b| { + b.iter(|| Workspace::new(&ws_root.join("Cargo.toml"), &config).unwrap()) + }); + } + group.finish(); +} + +// Criterion complains about the measurement time being too small, but the +// measurement time doesn't seem important to me, what is more important is +// the number of iterations which defaults to 100, which seems like a +// reasonable default. Otherwise, the measurement time would need to be +// changed per workspace. We wouldn't want to spend 60s on every workspace, +// that would take too long and isn't necessary for the smaller workspaces. +criterion_group!(benches, workspace_initialization); +criterion_main!(benches); diff --git a/benches/workspaces/rust-ws-inherit.tgz b/benches/workspaces/rust-ws-inherit.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6e7b6691ff7643975f2b7bf83800ab3aaebb1781 GIT binary patch literal 45123 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

#vt895sj30o9#c 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 U^S}T6U;oel4|eXv&;W`B05^gpjsO4v literal 0 HcmV?d00001