about summary refs log tree commit diff
path: root/library/alloc/src
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2021-05-16 21:31:18 -0400
committerMark Rousskov <mark.simulacrum@gmail.com>2021-05-17 09:29:02 -0400
commit80ac15f667c32b1e441cffaa3237cae2990cc152 (patch)
treea86a48b4fa77c0b767b6a70073532b0e9366367a /library/alloc/src
parent2a245f40a19c9a60b3be33c959eb5cfb0ad163c6 (diff)
downloadrust-80ac15f667c32b1e441cffaa3237cae2990cc152.tar.gz
rust-80ac15f667c32b1e441cffaa3237cae2990cc152.zip
Optimize default ToString impl
This avoids a zero-length write_str call, which boils down to a zero-length
memmove and ultimately costs quite a few instructions on some workloads.

This is approximately a 0.33% instruction count win on diesel-check.
Diffstat (limited to 'library/alloc/src')
-rw-r--r--library/alloc/src/string.rs5
1 files changed, 3 insertions, 2 deletions
diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs
index e6252452470..ec09595e357 100644
--- a/library/alloc/src/string.rs
+++ b/library/alloc/src/string.rs
@@ -2323,9 +2323,10 @@ impl<T: fmt::Display + ?Sized> ToString for T {
     // to try to remove it.
     #[inline]
     default fn to_string(&self) -> String {
-        use fmt::Write;
         let mut buf = String::new();
-        buf.write_fmt(format_args!("{}", self))
+        let mut formatter = core::fmt::Formatter::new(&mut buf);
+        // Bypass format_args!() to avoid write_str with zero-length strs
+        fmt::Display::fmt(self, &mut formatter)
             .expect("a Display implementation returned an error unexpectedly");
         buf
     }