diff options
| author | bors <bors@rust-lang.org> | 2024-12-30 04:46:52 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-12-30 04:46:52 +0000 |
| commit | 84e930871f3918d7654b13e0b716857e0980d93f (patch) | |
| tree | f0ac8de3c37b9dae20d4c1ecc2e5d245fb04f470 /compiler/rustc_codegen_ssa | |
| parent | 8cdc67ed23e486a9f2b3e667a50d9b8782ba4056 (diff) | |
| parent | 586a805d84630e068b77774f296f14cb29f69aff (diff) | |
Auto merge of #134866 - osiewicz:write-rlib-bufwriter, r=bjorn3
rustc_codegen_ssa: Buffer file writes in link_rlib This makes this step take ~25ms on my machine (M3 Max 64GB) for Zed repo instead of ~150ms (on editor crate). Additionally it takes down the time needed for a clean cargo build of ripgrep from ~6.1s to 5.9s. This change is mostly relevant for dev builds of crates with multiple large CGUs. I imagine it could be quite relevant for dev scenarios on Windows, but sadly I have no way to measure that myself.
Diffstat (limited to 'compiler/rustc_codegen_ssa')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/back/archive.rs | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/archive.rs b/compiler/rustc_codegen_ssa/src/back/archive.rs index d9eece1d8dc..58eb137c068 100644 --- a/compiler/rustc_codegen_ssa/src/back/archive.rs +++ b/compiler/rustc_codegen_ssa/src/back/archive.rs @@ -2,7 +2,7 @@ use std::env; use std::error::Error; use std::ffi::OsString; use std::fs::{self, File}; -use std::io::{self, Write}; +use std::io::{self, BufWriter, Write}; use std::path::{Path, PathBuf}; use ar_archive_writer::{ @@ -509,9 +509,10 @@ impl<'a> ArArchiveBuilder<'a> { io_error_context("couldn't create a directory for the temp file", err) })?; let archive_tmpfile_path = archive_tmpdir.path().join("tmp.a"); - let mut archive_tmpfile = File::create_new(&archive_tmpfile_path) + let archive_tmpfile = File::create_new(&archive_tmpfile_path) .map_err(|err| io_error_context("couldn't create the temp file", err))?; + let mut archive_tmpfile = BufWriter::new(archive_tmpfile); write_archive_to_stream( &mut archive_tmpfile, &entries, @@ -519,6 +520,8 @@ impl<'a> ArArchiveBuilder<'a> { false, /* is_ec = */ self.sess.target.arch == "arm64ec", )?; + archive_tmpfile.flush()?; + drop(archive_tmpfile); let any_entries = !entries.is_empty(); drop(entries); |
