Auto merge of #44613 - QuietMisdreavus:rustdoc-perf, r=michaelwoerister
some low-hanging rustdoc optimizations There were a few discussions earlier today in #rust-internals about the syscall usage and overall performance of rustdoc. This PR is intended to pick some low-hanging fruit and try to rein in some of the performance issues of rustdoc.
This commit is contained in:
commit
c4f489af91
1 changed files with 22 additions and 5 deletions
|
@ -125,6 +125,21 @@ pub struct SharedContext {
|
||||||
/// Warnings for the user if rendering would differ using different markdown
|
/// Warnings for the user if rendering would differ using different markdown
|
||||||
/// parsers.
|
/// parsers.
|
||||||
pub markdown_warnings: RefCell<Vec<(Span, String, Vec<html_diff::Difference>)>>,
|
pub markdown_warnings: RefCell<Vec<(Span, String, Vec<html_diff::Difference>)>>,
|
||||||
|
/// The directories that have already been created in this doc run. Used to reduce the number
|
||||||
|
/// of spurious `create_dir_all` calls.
|
||||||
|
pub created_dirs: RefCell<FxHashSet<PathBuf>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SharedContext {
|
||||||
|
fn ensure_dir(&self, dst: &Path) -> io::Result<()> {
|
||||||
|
let mut dirs = self.created_dirs.borrow_mut();
|
||||||
|
if !dirs.contains(dst) {
|
||||||
|
fs::create_dir_all(dst)?;
|
||||||
|
dirs.insert(dst.to_path_buf());
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Indicates where an external crate can be found.
|
/// Indicates where an external crate can be found.
|
||||||
|
@ -463,6 +478,7 @@ pub fn run(mut krate: clean::Crate,
|
||||||
},
|
},
|
||||||
css_file_extension: css_file_extension.clone(),
|
css_file_extension: css_file_extension.clone(),
|
||||||
markdown_warnings: RefCell::new(vec![]),
|
markdown_warnings: RefCell::new(vec![]),
|
||||||
|
created_dirs: RefCell::new(FxHashSet()),
|
||||||
};
|
};
|
||||||
|
|
||||||
// If user passed in `--playground-url` arg, we fill in crate name here
|
// If user passed in `--playground-url` arg, we fill in crate name here
|
||||||
|
@ -794,7 +810,6 @@ fn write_shared(cx: &Context,
|
||||||
// Write out the shared files. Note that these are shared among all rustdoc
|
// Write out the shared files. Note that these are shared among all rustdoc
|
||||||
// docs placed in the output directory, so this needs to be a synchronized
|
// docs placed in the output directory, so this needs to be a synchronized
|
||||||
// operation with respect to all other rustdocs running around.
|
// operation with respect to all other rustdocs running around.
|
||||||
try_err!(fs::create_dir_all(&cx.dst), &cx.dst);
|
|
||||||
let _lock = flock::Lock::panicking_new(&cx.dst.join(".lock"), true, true, true);
|
let _lock = flock::Lock::panicking_new(&cx.dst.join(".lock"), true, true, true);
|
||||||
|
|
||||||
// Add all the static files. These may already exist, but we just
|
// Add all the static files. These may already exist, but we just
|
||||||
|
@ -1518,8 +1533,8 @@ impl Context {
|
||||||
this.render_item(&mut buf, &item, false).unwrap();
|
this.render_item(&mut buf, &item, false).unwrap();
|
||||||
// buf will be empty if the module is stripped and there is no redirect for it
|
// buf will be empty if the module is stripped and there is no redirect for it
|
||||||
if !buf.is_empty() {
|
if !buf.is_empty() {
|
||||||
|
try_err!(this.shared.ensure_dir(&this.dst), &this.dst);
|
||||||
let joint_dst = this.dst.join("index.html");
|
let joint_dst = this.dst.join("index.html");
|
||||||
try_err!(fs::create_dir_all(&this.dst), &this.dst);
|
|
||||||
let mut dst = try_err!(File::create(&joint_dst), &joint_dst);
|
let mut dst = try_err!(File::create(&joint_dst), &joint_dst);
|
||||||
try_err!(dst.write_all(&buf), &joint_dst);
|
try_err!(dst.write_all(&buf), &joint_dst);
|
||||||
}
|
}
|
||||||
|
@ -1553,8 +1568,8 @@ impl Context {
|
||||||
let name = item.name.as_ref().unwrap();
|
let name = item.name.as_ref().unwrap();
|
||||||
let item_type = item.type_();
|
let item_type = item.type_();
|
||||||
let file_name = &item_path(item_type, name);
|
let file_name = &item_path(item_type, name);
|
||||||
|
try_err!(self.shared.ensure_dir(&self.dst), &self.dst);
|
||||||
let joint_dst = self.dst.join(file_name);
|
let joint_dst = self.dst.join(file_name);
|
||||||
try_err!(fs::create_dir_all(&self.dst), &self.dst);
|
|
||||||
let mut dst = try_err!(File::create(&joint_dst), &joint_dst);
|
let mut dst = try_err!(File::create(&joint_dst), &joint_dst);
|
||||||
try_err!(dst.write_all(&buf), &joint_dst);
|
try_err!(dst.write_all(&buf), &joint_dst);
|
||||||
|
|
||||||
|
@ -1562,9 +1577,10 @@ impl Context {
|
||||||
// URL for the page.
|
// URL for the page.
|
||||||
let redir_name = format!("{}.{}.html", name, item_type.name_space());
|
let redir_name = format!("{}.{}.html", name, item_type.name_space());
|
||||||
let redir_dst = self.dst.join(redir_name);
|
let redir_dst = self.dst.join(redir_name);
|
||||||
if let Ok(mut redirect_out) = OpenOptions::new().create_new(true)
|
if let Ok(redirect_out) = OpenOptions::new().create_new(true)
|
||||||
.write(true)
|
.write(true)
|
||||||
.open(&redir_dst) {
|
.open(&redir_dst) {
|
||||||
|
let mut redirect_out = BufWriter::new(redirect_out);
|
||||||
try_err!(layout::redirect(&mut redirect_out, file_name), &redir_dst);
|
try_err!(layout::redirect(&mut redirect_out, file_name), &redir_dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1574,7 +1590,8 @@ impl Context {
|
||||||
if item_type == ItemType::Macro {
|
if item_type == ItemType::Macro {
|
||||||
let redir_name = format!("{}.{}!.html", item_type, name);
|
let redir_name = format!("{}.{}!.html", item_type, name);
|
||||||
let redir_dst = self.dst.join(redir_name);
|
let redir_dst = self.dst.join(redir_name);
|
||||||
let mut redirect_out = try_err!(File::create(&redir_dst), &redir_dst);
|
let redirect_out = try_err!(File::create(&redir_dst), &redir_dst);
|
||||||
|
let mut redirect_out = BufWriter::new(redirect_out);
|
||||||
try_err!(layout::redirect(&mut redirect_out, file_name), &redir_dst);
|
try_err!(layout::redirect(&mut redirect_out, file_name), &redir_dst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue