From eae615dfdd9222a49182e59cc15bd47da1d536b6 Mon Sep 17 00:00:00 2001 From: yukang Date: Sun, 8 Jan 2023 05:02:04 +0800 Subject: [PATCH 1/2] Remove unnecessary lseek syscall when using std::fs::read --- library/std/src/fs.rs | 8 ++++++-- 1 file 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>(path: P) -> io::Result> { fn inner(path: &Path) -> io::Result> { 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>(path: P) -> io::Result { fn inner(path: &Path) -> io::Result { 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()) From f7bc68bb4edd1974f7c4aa6113902132429c00e8 Mon Sep 17 00:00:00 2001 From: yukang Date: Wed, 11 Jan 2023 00:19:27 +0800 Subject: [PATCH 2/2] use with_capacity in read read_to_string --- library/std/src/fs.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/library/std/src/fs.rs b/library/std/src/fs.rs index 6ddd5c28cc2..5c5ef0b1125 100644 --- a/library/std/src/fs.rs +++ b/library/std/src/fs.rs @@ -249,9 +249,8 @@ pub struct DirBuilder { pub fn read>(path: P) -> io::Result> { fn inner(path: &Path) -> io::Result> { let mut file = File::open(path)?; - let mut bytes = Vec::new(); let size = file.metadata().map(|m| m.len()).unwrap_or(0); - bytes.reserve(size as usize); + let mut bytes = Vec::with_capacity(size as usize); io::default_read_to_end(&mut file, &mut bytes)?; Ok(bytes) } @@ -290,9 +289,8 @@ pub fn read>(path: P) -> io::Result> { pub fn read_to_string>(path: P) -> io::Result { fn inner(path: &Path) -> io::Result { let mut file = File::open(path)?; - let mut string = String::new(); let size = file.metadata().map(|m| m.len()).unwrap_or(0); - string.reserve(size as usize); + let mut string = String::with_capacity(size as usize); io::default_read_to_string(&mut file, &mut string)?; Ok(string) }