Skip to content

Commit 50a7969

Browse files
committed
Add some timing info to rustdoc
There are various improvements, but the main one is to time each pass that rustdoc performs (`rustdoc::passes`). Before, these were the top five timings for `cargo doc` on the cargo repository: ``` +---------------------------------+-----------+-----------------+----------+------------+ | Item | Self time | % of total time | Time | Item count | +---------------------------------+-----------+-----------------+----------+------------+ | <unknown> | 854.70ms | 20.888 | 2.47s | 744823 | +---------------------------------+-----------+-----------------+----------+------------+ | expand_crate | 795.29ms | 19.436 | 848.00ms | 1 | +---------------------------------+-----------+-----------------+----------+------------+ | metadata_decode_entry | 256.73ms | 6.274 | 279.49ms | 518344 | +---------------------------------+-----------+-----------------+----------+------------+ | resolve_crate | 240.56ms | 5.879 | 242.86ms | 1 | +---------------------------------+-----------+-----------------+----------+------------+ | hir_lowering | 146.79ms | 3.587 | 146.79ms | 1 | +---------------------------------+-----------+-----------------+----------+------------+ ``` Now the timings are: ``` +---------------------------------+-----------+-----------------+----------+------------+ | Item | Self time | % of total time | Time | Item count | +---------------------------------+-----------+-----------------+----------+------------+ | <unknown> | 1.40s | 22.662 | 3.73s | 771430 | +---------------------------------+-----------+-----------------+----------+------------+ | collect-trait-impls | 1.34s | 21.672 | 2.87s | 1 | +---------------------------------+-----------+-----------------+----------+------------+ | expand_crate | 1.21s | 19.577 | 1.28s | 1 | +---------------------------------+-----------+-----------------+----------+------------+ | build extern trait impl | 704.66ms | 11.427 | 1.07s | 21893 | +---------------------------------+-----------+-----------------+----------+------------+ | metadata_decode_entry | 354.84ms | 5.754 | 391.81ms | 544919 | +---------------------------------+-----------+-----------------+----------+------------+ ```
1 parent 8fdce9b commit 50a7969

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

src/librustdoc/core.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,9 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
407407
let hir = tcx.hir();
408408
let body = hir.body(hir.body_owned_by(hir.local_def_id_to_hir_id(def_id)));
409409
debug!("visiting body for {:?}", def_id);
410+
tcx.sess.time("emit ignored resolution errors", || {
410411
EmitIgnoredResolutionErrors::new(tcx).visit_body(body);
412+
});
411413
(rustc_interface::DEFAULT_QUERY_PROVIDERS.typeck)(tcx, def_id)
412414
};
413415
}),
@@ -430,6 +432,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
430432
// intra-doc-links
431433
resolver.borrow_mut().access(|resolver| {
432434
for extern_name in &extern_names {
435+
sess.time("load extern crate", || {
433436
resolver
434437
.resolve_str_path_error(
435438
DUMMY_SP,
@@ -440,6 +443,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
440443
.unwrap_or_else(|()| {
441444
panic!("Unable to resolve external crate {}", extern_name)
442445
});
446+
});
443447
}
444448
});
445449

@@ -480,7 +484,9 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
480484
tcx.ensure().check_mod_attrs(local_def_id);
481485
}
482486

483-
let access_levels = tcx.privacy_access_levels(LOCAL_CRATE);
487+
let access_levels = tcx
488+
.sess
489+
.time("privacy_access_levels", || tcx.privacy_access_levels(LOCAL_CRATE));
484490
// Convert from a HirId set to a DefId set since we don't always have easy access
485491
// to the map from defid -> hirid
486492
let access_levels = AccessLevels {
@@ -519,7 +525,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
519525
};
520526
debug!("crate: {:?}", tcx.hir().krate());
521527

522-
let mut krate = clean::krate(&mut ctxt);
528+
let mut krate = tcx.sess.time("clean crate", || clean::krate(&mut ctxt));
523529

524530
if let Some(ref m) = krate.module {
525531
if let None | Some("") = m.doc_value() {
@@ -618,7 +624,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
618624
};
619625
if run {
620626
debug!("running pass {}", p.pass.name);
621-
krate = (p.pass.run)(krate, &ctxt);
627+
krate = ctxt.tcx.sess.time(p.pass.name, || (p.pass.run)(krate, &ctxt));
622628
}
623629
}
624630

src/librustdoc/passes/collect_trait_impls.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ pub fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate {
2929

3030
for &cnum in cx.tcx.crates().iter() {
3131
for &(did, _) in cx.tcx.all_trait_implementations(cnum).iter() {
32-
inline::build_impl(cx, did, None, &mut new_items);
32+
cx.tcx.sess.time("build extern trait impl", || {
33+
inline::build_impl(cx, did, None, &mut new_items);
34+
});
3335
}
3436
}
3537

@@ -87,7 +89,9 @@ pub fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate {
8789
for &trait_did in cx.tcx.all_traits(LOCAL_CRATE).iter() {
8890
for &impl_node in cx.tcx.hir().trait_impls(trait_did) {
8991
let impl_did = cx.tcx.hir().local_def_id(impl_node);
90-
inline::build_impl(cx, impl_did.to_def_id(), None, &mut new_items);
92+
cx.tcx.sess.time("build local trait impl", || {
93+
inline::build_impl(cx, impl_did.to_def_id(), None, &mut new_items);
94+
});
9195
}
9296
}
9397

0 commit comments

Comments
 (0)