about summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-12-30 04:46:52 +0000
committerbors <bors@rust-lang.org>2024-12-30 04:46:52 +0000
commit84e930871f3918d7654b13e0b716857e0980d93f (patch)
treef0ac8de3c37b9dae20d4c1ecc2e5d245fb04f470 /compiler/rustc_codegen_ssa
parent8cdc67ed23e486a9f2b3e667a50d9b8782ba4056 (diff)
parent586a805d84630e068b77774f296f14cb29f69aff (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.rs7
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);