Skip to content

Commit 5a1e544

Browse files
committed
Auto merge of rust-lang#121001 - nyurik:optimize-core-fmt, r=cuviper
perf: improve write_fmt to handle simple strings In case format string has no arguments, simplify its implementation with a direct call to `output.write_str(value)`. This builds on `@dtolnay` original [suggestion](serde-rs/serde#2697 (comment)). This does not change any expectations because the original `fn write()` implementation calls `write_str` for parts of the format string. ```rust write!(f, "text") -> f.write_str("text") ``` ```diff /// [`write!`]: crate::write! +#[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn write(output: &mut dyn Write, args: Arguments<'_>) -> Result { + if let Some(s) = args.as_str() { output.write_str(s) } else { write_internal(output, args) } +} + +/// Actual implementation of the [`write`], but without the simple string optimization. +fn write_internal(output: &mut dyn Write, args: Arguments<'_>) -> Result { let mut formatter = Formatter::new(output); let mut idx = 0; ``` * Hopefully it will improve the simple case for the rust-lang#99012 * Another related (original?) issues rust-lang#10761 * Previous similar attempt to fix it by by `@Kobzol` rust-lang#100700 CC: `@m-ou-se` as probably the biggest expert in everything `format!`
2 parents 1547c07 + c85a9df commit 5a1e544

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

library/core/src/fmt/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1102,8 +1102,14 @@ pub trait UpperExp {
11021102
/// ```
11031103
///
11041104
/// [`write!`]: crate::write!
1105+
#[inline]
11051106
#[stable(feature = "rust1", since = "1.0.0")]
11061107
pub fn write(output: &mut dyn Write, args: Arguments<'_>) -> Result {
1108+
if let Some(s) = args.as_str() { output.write_str(s) } else { write_internal(output, args) }
1109+
}
1110+
1111+
/// Actual implementation of the [`write()`], but without the simple string optimization.
1112+
fn write_internal(output: &mut dyn Write, args: Arguments<'_>) -> Result {
11071113
let mut formatter = Formatter::new(output);
11081114
let mut idx = 0;
11091115

0 commit comments

Comments
 (0)