Skip to content

Commit 6d532fd

Browse files
Various cargo-bazel performance improvements (#3588)
This is around 15-20% performance improvement on the entire module extension execution in my repo Co-authored-by: Daniel Wagner-Hall <[email protected]>
1 parent 0f8b797 commit 6d532fd

File tree

3 files changed

+118
-132
lines changed

3 files changed

+118
-132
lines changed

crate_universe/src/cli/splice.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ pub fn splice(opt: SpliceOptions) -> Result<()> {
163163
})?;
164164
let contents = metadata
165165
.packages
166-
.iter()
167-
.map(|package| package.manifest_path.clone())
166+
.into_iter()
167+
.map(|package| package.manifest_path)
168168
.join("\n");
169169
std::fs::write(opt.output_dir.join("extra_paths_to_track"), contents)?;
170170
}

crate_universe/src/metadata/dependency.rs

Lines changed: 53 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,8 @@ impl DependencySet {
4444
pub(crate) fn new_for_node(
4545
node: &Node,
4646
metadata: &CargoMetadata,
47-
resolver_data: &TreeResolverMetadata,
47+
tree_data: Option<&Select<BTreeSet<CrateId>>>,
4848
) -> Self {
49-
// Build a dep tree mapping that's easily indexable via `cargo_metadata::PackageId`
50-
let dep_tree: BTreeMap<CrateId, Select<BTreeSet<CrateId>>> = resolver_data
51-
.iter()
52-
.map(|(id, tree_data)| {
53-
let mut select = Select::new();
54-
for (config, data) in tree_data.items() {
55-
for dep in data.deps {
56-
select.insert(dep, config.clone());
57-
}
58-
}
59-
(id.clone(), select)
60-
})
61-
.collect();
62-
63-
let crate_id = {
64-
let package = &metadata[&node.id];
65-
CrateId::from(package)
66-
};
67-
6849
let (normal_dev_deps, normal_deps) = {
6950
let (dev, normal) = node
7051
.deps
@@ -81,15 +62,9 @@ impl DependencySet {
8162
dev,
8263
metadata,
8364
DependencyKind::Development,
84-
dep_tree.get(&crate_id),
85-
),
86-
collect_deps_selectable(
87-
node,
88-
normal,
89-
metadata,
90-
DependencyKind::Normal,
91-
dep_tree.get(&crate_id),
65+
tree_data,
9266
),
67+
collect_deps_selectable(node, normal, metadata, DependencyKind::Normal, tree_data),
9368
)
9469
};
9570

@@ -109,15 +84,9 @@ impl DependencySet {
10984
dev,
11085
metadata,
11186
DependencyKind::Development,
112-
dep_tree.get(&crate_id),
113-
),
114-
collect_deps_selectable(
115-
node,
116-
normal,
117-
metadata,
118-
DependencyKind::Normal,
119-
dep_tree.get(&crate_id),
87+
tree_data,
12088
),
89+
collect_deps_selectable(node, normal, metadata, DependencyKind::Normal, tree_data),
12190
)
12291
};
12392

@@ -139,15 +108,9 @@ impl DependencySet {
139108
proc_macro,
140109
metadata,
141110
DependencyKind::Build,
142-
dep_tree.get(&crate_id),
143-
),
144-
collect_deps_selectable(
145-
node,
146-
normal,
147-
metadata,
148-
DependencyKind::Build,
149-
dep_tree.get(&crate_id),
111+
tree_data,
150112
),
113+
collect_deps_selectable(node, normal, metadata, DependencyKind::Build, tree_data),
151114
)
152115
};
153116

@@ -166,7 +129,7 @@ impl DependencySet {
166129
.filter(|(_, dependency)| metadata[&dependency.package_id].links.is_some())
167130
{
168131
// Add any normal dependency to build dependencies that are associated `*-sys` crates
169-
build_link_deps.insert(dependency.clone(), configuration.clone());
132+
build_link_deps.insert(dependency, configuration);
170133
}
171134

172135
Self {
@@ -181,6 +144,24 @@ impl DependencySet {
181144
}
182145
}
183146

147+
/// Build a dep tree mapping that's easily indexable via `cargo_metadata::PackageId`
148+
pub(crate) fn build_dep_tree(
149+
resolver_data: &TreeResolverMetadata,
150+
) -> BTreeMap<CrateId, Select<BTreeSet<CrateId>>> {
151+
resolver_data
152+
.iter()
153+
.map(|(id, tree_data)| {
154+
let mut select = Select::new();
155+
for (config, data) in tree_data.items() {
156+
for dep in data.deps {
157+
select.insert(dep, config.clone());
158+
}
159+
}
160+
(id.clone(), select)
161+
})
162+
.collect()
163+
}
164+
184165
/// For details on optional dependencies see [the Rust docs](https://doc.rust-lang.org/cargo/reference/features.html#optional-dependencies).
185166
fn is_optional_dependency(
186167
parent: &Node,
@@ -539,8 +520,7 @@ mod test {
539520
let metadata = metadata::example_proc_macro_dep();
540521

541522
let node = find_metadata_node("example-proc-macro-dep", &metadata);
542-
let dependencies =
543-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
523+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
544524

545525
let normal_deps: Vec<_> = dependencies
546526
.normal_deps
@@ -564,8 +544,7 @@ mod test {
564544
let metadata = metadata::alias();
565545

566546
let node = find_metadata_node("surrealdb-core", &metadata);
567-
let dependencies =
568-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
547+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
569548

570549
let bindings = dependencies.normal_deps.items();
571550

@@ -588,8 +567,7 @@ mod test {
588567

589568
let openssl_node = find_metadata_node("openssl", &metadata);
590569

591-
let dependencies =
592-
DependencySet::new_for_node(openssl_node, &metadata, &TreeResolverMetadata::default());
570+
let dependencies = DependencySet::new_for_node(openssl_node, &metadata, None);
593571

594572
let normal_sys_crate =
595573
dependencies
@@ -622,8 +600,7 @@ mod test {
622600
let metadata = metadata::build_scripts();
623601

624602
let libssh2 = find_metadata_node("libssh2-sys", &metadata);
625-
let libssh2_depset =
626-
DependencySet::new_for_node(libssh2, &metadata, &TreeResolverMetadata::default());
603+
let libssh2_depset = DependencySet::new_for_node(libssh2, &metadata, None);
627604

628605
// Collect build dependencies into a set
629606
let build_deps: BTreeSet<String> = libssh2_depset
@@ -672,8 +649,7 @@ mod test {
672649
let metadata = metadata::alias();
673650

674651
let aliases_node = find_metadata_node("aliases", &metadata);
675-
let dependencies =
676-
DependencySet::new_for_node(aliases_node, &metadata, &TreeResolverMetadata::default());
652+
let dependencies = DependencySet::new_for_node(aliases_node, &metadata, None);
677653

678654
let aliases: Vec<Dependency> = dependencies
679655
.normal_deps
@@ -699,8 +675,7 @@ mod test {
699675
let metadata = metadata::crate_types();
700676

701677
let node = find_metadata_node("crate-types", &metadata);
702-
let dependencies =
703-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
678+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
704679

705680
let rlib_deps: Vec<Dependency> = dependencies
706681
.normal_deps
@@ -730,8 +705,7 @@ mod test {
730705
let metadata = metadata::multi_cfg_dep();
731706

732707
let node = find_metadata_node("cpufeatures", &metadata);
733-
let dependencies =
734-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
708+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
735709

736710
let libc_cfgs: BTreeSet<Option<String>> = dependencies
737711
.normal_deps
@@ -756,8 +730,7 @@ mod test {
756730
let metadata = metadata::multi_kind_proc_macro_dep();
757731

758732
let node = find_metadata_node("multi-kind-proc-macro-dep", &metadata);
759-
let dependencies =
760-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
733+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
761734

762735
let lib_deps: Vec<_> = dependencies
763736
.proc_macro_deps
@@ -781,8 +754,7 @@ mod test {
781754
let metadata = metadata::optional_deps_disabled();
782755

783756
let node = find_metadata_node("clap", &metadata);
784-
let dependencies =
785-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
757+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
786758

787759
assert!(!dependencies
788760
.normal_deps
@@ -797,8 +769,7 @@ mod test {
797769
let metadata = metadata::renamed_optional_deps_disabled();
798770

799771
let serde_with = find_metadata_node("serde_with", &metadata);
800-
let serde_with_depset =
801-
DependencySet::new_for_node(serde_with, &metadata, &TreeResolverMetadata::new());
772+
let serde_with_depset = DependencySet::new_for_node(serde_with, &metadata, None);
802773
assert!(!serde_with_depset
803774
.normal_deps
804775
.items()
@@ -820,13 +791,13 @@ mod test {
820791
},
821792
None,
822793
);
823-
let resolver_data = TreeResolverMetadata::from([(
824-
CrateId::new("clap".to_owned(), Version::new(4, 1, 1)),
825-
select,
826-
)]);
794+
795+
let crate_id = CrateId::new("clap".to_owned(), Version::new(4, 1, 1));
796+
let resolver_data = TreeResolverMetadata::from([(crate_id.clone(), select)]);
827797

828798
let clap = find_metadata_node("clap", &metadata);
829-
let clap_depset = DependencySet::new_for_node(clap, &metadata, &resolver_data);
799+
let dep_tree = build_dep_tree(&resolver_data);
800+
let clap_depset = DependencySet::new_for_node(clap, &metadata, dep_tree.get(&crate_id));
830801
assert_eq!(
831802
clap_depset
832803
.normal_deps
@@ -839,8 +810,7 @@ mod test {
839810
);
840811

841812
let notify = find_metadata_node("notify", &metadata);
842-
let notify_depset =
843-
DependencySet::new_for_node(notify, &metadata, &TreeResolverMetadata::default());
813+
let notify_depset = DependencySet::new_for_node(notify, &metadata, None);
844814

845815
// mio is not present in the common list of dependencies
846816
assert!(!notify_depset
@@ -873,8 +843,7 @@ mod test {
873843
let metadata = metadata::optional_deps_disabled_build_dep_enabled();
874844

875845
let node = find_metadata_node("gherkin", &metadata);
876-
let dependencies =
877-
DependencySet::new_for_node(node, &metadata, &TreeResolverMetadata::default());
846+
let dependencies = DependencySet::new_for_node(node, &metadata, None);
878847

879848
assert!(!dependencies
880849
.normal_deps
@@ -901,13 +870,13 @@ mod test {
901870
},
902871
None,
903872
);
904-
let resolver_data = TreeResolverMetadata::from([(
905-
CrateId::new("p256".to_owned(), Version::new(0, 13, 2)),
906-
select,
907-
)]);
873+
874+
let crate_id = CrateId::new("p256".to_owned(), Version::new(0, 13, 2));
875+
let resolver_data = TreeResolverMetadata::from([(crate_id.clone(), select)]);
908876

909877
let p256 = find_metadata_node("p256", &metadata);
910-
let p256_depset = DependencySet::new_for_node(p256, &metadata, &resolver_data);
878+
let dep_tree = build_dep_tree(&resolver_data);
879+
let p256_depset = DependencySet::new_for_node(p256, &metadata, dep_tree.get(&crate_id));
911880
assert_eq!(
912881
p256_depset
913882
.normal_deps
@@ -959,13 +928,13 @@ mod test {
959928
None,
960929
);
961930

962-
let tree_metadata = TreeResolverMetadata::from([(
963-
CrateId::new("tokio".to_owned(), Version::new(1, 37, 0)),
964-
select,
965-
)]);
931+
let crate_id = CrateId::new("tokio".to_owned(), Version::new(1, 37, 0));
932+
let resolver_data = TreeResolverMetadata::from([(crate_id.clone(), select)]);
966933

967934
let tokio_node = find_metadata_node("tokio", &metadata);
968-
let tokio_depset = DependencySet::new_for_node(tokio_node, &metadata, &tree_metadata);
935+
let dep_tree = build_dep_tree(&resolver_data);
936+
let tokio_depset =
937+
DependencySet::new_for_node(tokio_node, &metadata, dep_tree.get(&crate_id));
969938
assert_eq!(
970939
tokio_depset
971940
.normal_deps

0 commit comments

Comments
 (0)