diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2021-05-16 21:31:18 -0400 |
|---|---|---|
| committer | Mark Rousskov <mark.simulacrum@gmail.com> | 2021-05-17 09:29:02 -0400 |
| commit | 80ac15f667c32b1e441cffaa3237cae2990cc152 (patch) | |
| tree | a86a48b4fa77c0b767b6a70073532b0e9366367a /library/alloc/src | |
| parent | 2a245f40a19c9a60b3be33c959eb5cfb0ad163c6 (diff) | |
| download | rust-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.rs | 5 |
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 } |
