Skip to content

Commit 7056251

Browse files
perf: Avoid long-tail execution for complex crates on a single thread
1 parent b2c73a2 commit 7056251

File tree

1 file changed

+35
-28
lines changed
  • compiler/pavexc/src/rustdoc/compute

1 file changed

+35
-28
lines changed

compiler/pavexc/src/rustdoc/compute/cache.rs

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -853,20 +853,20 @@ impl<'a> CacheEntry<'a> {
853853
/// We hydrate all mappings eagerly, but we avoid re-hydrating the item index eagerly,
854854
/// since it can be quite large and deserialization can be slow for large crates.
855855
pub(super) fn hydrate(self, package_id: PackageId) -> Result<RustdocCacheEntry, anyhow::Error> {
856-
let span = tracing::trace_span!("Deserialize delimiters");
857-
let _guard = span.enter();
858-
let item_id2delimiters =
859-
bincode::serde::decode_from_slice(&self.item_id2delimiters, BINCODE_CONFIG)
860-
.context("Failed to deserialize item_id2delimiters")?
861-
.0;
862-
drop(_guard);
863-
864-
let span = tracing::trace_span!("Deserialize paths");
865-
let _guard = span.enter();
866-
let paths = bincode::serde::decode_from_slice(&self.paths, BINCODE_CONFIG)
867-
.context("Failed to deserialize paths")?
868-
.0;
869-
drop(_guard);
856+
let (item_id2delimiters, paths) = rayon::join(
857+
|| {
858+
tracing::trace_span!("Deserialize delimiters")
859+
.in_scope(|| {
860+
bincode::serde::decode_from_slice(&self.item_id2delimiters, BINCODE_CONFIG)
861+
})
862+
.context("Failed to deserialize item_id2delimiters")
863+
},
864+
|| {
865+
tracing::trace_span!("Deserialize paths")
866+
.in_scope(|| bincode::serde::decode_from_slice(&self.paths, BINCODE_CONFIG))
867+
.context("Failed to deserialize paths")
868+
},
869+
);
870870

871871
let crate_data = CrateData {
872872
root_item_id: rustdoc_types::Id(self.root_item_id.to_owned()),
@@ -876,11 +876,11 @@ impl<'a> CacheEntry<'a> {
876876
)
877877
.context("Failed to deserialize external_crates")?
878878
.0,
879-
paths,
879+
paths: paths?.0,
880880
format_version: self.format_version.try_into()?,
881881
index: CrateItemIndex::Lazy(LazyCrateItemIndex {
882882
items: self.items.into_owned(),
883-
item_id2delimiters,
883+
item_id2delimiters: item_id2delimiters?.0,
884884
}),
885885
};
886886
let Some(secondary_indexes) = self.secondary_indexes else {
@@ -892,24 +892,31 @@ impl<'a> CacheEntry<'a> {
892892
krate: crate_data,
893893
};
894894

895-
let span = tracing::trace_span!("Deserialize import_path2id");
896-
let _guard = span.enter();
897-
let import_path2id =
898-
bincode::serde::decode_from_slice(&secondary_indexes.import_path2id, BINCODE_CONFIG)
899-
.context("Failed to deserialize import_path2id")?
900-
.0;
901-
drop(_guard);
895+
let (import_path2id, import_index) = rayon::join(
896+
|| {
897+
tracing::trace_span!("Deserialize import_path2id")
898+
.in_scope(|| {
899+
bincode::serde::decode_from_slice(
900+
&secondary_indexes.import_path2id,
901+
BINCODE_CONFIG,
902+
)
903+
})
904+
.context("Failed to deserialize import_path2id")
905+
},
906+
|| {
907+
bincode::serde::decode_from_slice(&secondary_indexes.import_index, BINCODE_CONFIG)
908+
.context("Failed to deserialize import_index")
909+
},
910+
);
911+
912+
let import_path2id = import_path2id?.0;
913+
let import_index = import_index?.0;
902914

903915
let re_exports =
904916
bincode::serde::decode_from_slice(&secondary_indexes.re_exports, BINCODE_CONFIG)
905917
.context("Failed to deserialize re-exports")?
906918
.0;
907919

908-
let import_index =
909-
bincode::serde::decode_from_slice(&secondary_indexes.import_index, BINCODE_CONFIG)
910-
.context("Failed to deserialize import_index")?
911-
.0;
912-
913920
let annotated_items = if let Some(data) = secondary_indexes.annotated_items {
914921
bincode::serde::decode_from_slice(&data, BINCODE_CONFIG)
915922
.context("Failed to deserialize annotated_items")?

0 commit comments

Comments
 (0)