about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2023-01-08 05:02:04 +0800
committeryukang <moorekang@gmail.com>2023-01-08 05:02:04 +0800
commiteae615dfdd9222a49182e59cc15bd47da1d536b6 (patch)
tree0a478eac89a5cbaaec2ead2d1320a1fa996fb24c
parent2afe58571e53d48a1fc2354271abe5aff60c5c44 (diff)
downloadrust-eae615dfdd9222a49182e59cc15bd47da1d536b6.tar.gz
rust-eae615dfdd9222a49182e59cc15bd47da1d536b6.zip
Remove unnecessary lseek syscall when using std::fs::read
-rw-r--r--library/std/src/fs.rs8
1 files changed, 6 insertions, 2 deletions
diff --git a/library/std/src/fs.rs b/library/std/src/fs.rs
index f357d505fe8..6ddd5c28cc2 100644
--- a/library/std/src/fs.rs
+++ b/library/std/src/fs.rs
@@ -250,7 +250,9 @@ pub fn read<P: AsRef<Path>>(path: P) -> io::Result<Vec<u8>> {
     fn inner(path: &Path) -> io::Result<Vec<u8>> {
         let mut file = File::open(path)?;
         let mut bytes = Vec::new();
-        file.read_to_end(&mut bytes)?;
+        let size = file.metadata().map(|m| m.len()).unwrap_or(0);
+        bytes.reserve(size as usize);
+        io::default_read_to_end(&mut file, &mut bytes)?;
         Ok(bytes)
     }
     inner(path.as_ref())
@@ -289,7 +291,9 @@ pub fn read_to_string<P: AsRef<Path>>(path: P) -> io::Result<String> {
     fn inner(path: &Path) -> io::Result<String> {
         let mut file = File::open(path)?;
         let mut string = String::new();
-        file.read_to_string(&mut string)?;
+        let size = file.metadata().map(|m| m.len()).unwrap_or(0);
+        string.reserve(size as usize);
+        io::default_read_to_string(&mut file, &mut string)?;
         Ok(string)
     }
     inner(path.as_ref())