Auto merge of #128320 - saethlin:link-me-maybe, r=compiler-errors
Avoid no-op unlink+link dances in incr comp Incremental compilation scales quite poorly with the number of CGUs. This PR improves one reason for that. The incr comp process hard-links all the files from an old session into a new one, then it runs the backend, which may just hard-link the new session files into the output directory. Then codegen hard-links all the output files back to the new session directory. This PR (perhaps unimaginatively) fixes the silliness that ensues in the last step. The old `link_or_copy` implementation would be passed pairs of paths which are already the same inode, then it would blindly delete the destination and re-create the hard-link that it just deleted. This PR lets us skip both those operations. We don't skip the other two hard-links. `cargo +stage1 b && touch crates/core/main.rs && strace -cfw -elink,linkat,unlink,unlinkat cargo +stage1 b` before and then after on `ripgrep-13.0.0`: ``` % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 52.56 0.024950 25 978 485 unlink 34.38 0.016318 22 727 linkat 13.06 0.006200 24 249 unlinkat ------ ----------- ----------- --------- --------- ---------------- 100.00 0.047467 24 1954 485 total ``` ``` % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 42.83 0.014521 57 252 unlink 38.41 0.013021 26 486 linkat 18.77 0.006362 25 249 unlinkat ------ ----------- ----------- --------- --------- ---------------- 100.00 0.033904 34 987 total ``` This reduces the number of hard-links that are causing perf troubles, noted in https://github.com/rust-lang/rust/issues/64291 and https://github.com/rust-lang/rust/issues/137560
This commit is contained in:
commit
48b36c9d59
6 changed files with 57 additions and 26 deletions
|
@ -3,7 +3,7 @@
|
|||
//! [work products]: WorkProduct
|
||||
|
||||
use std::fs as std_fs;
|
||||
use std::path::Path;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
use rustc_fs_util::link_or_copy;
|
||||
|
@ -20,6 +20,7 @@ pub fn copy_cgu_workproduct_to_incr_comp_cache_dir(
|
|||
sess: &Session,
|
||||
cgu_name: &str,
|
||||
files: &[(&'static str, &Path)],
|
||||
known_links: &[PathBuf],
|
||||
) -> Option<(WorkProductId, WorkProduct)> {
|
||||
debug!(?cgu_name, ?files);
|
||||
sess.opts.incremental.as_ref()?;
|
||||
|
@ -28,6 +29,10 @@ pub fn copy_cgu_workproduct_to_incr_comp_cache_dir(
|
|||
for (ext, path) in files {
|
||||
let file_name = format!("{cgu_name}.{ext}");
|
||||
let path_in_incr_dir = in_incr_comp_dir_sess(sess, &file_name);
|
||||
if known_links.contains(&path_in_incr_dir) {
|
||||
let _ = saved_files.insert(ext.to_string(), file_name);
|
||||
continue;
|
||||
}
|
||||
match link_or_copy(path, &path_in_incr_dir) {
|
||||
Ok(_) => {
|
||||
let _ = saved_files.insert(ext.to_string(), file_name);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue