format! 도 있으나 항상 새로운 힙할당이 일어나므로 성능면에서 떨어짐.
포맷팅 가능하면서 힙할당없이(capacity 초과시 재할당은 있음) 가능한 매크로이므로
format! 의 장점은 취하면서도 단점은 보완된 매크로같다.
훌륭한 질문입니다. 정말로 단순히 문자열을 덧붙이는 목적이라면 push_str만으로 충분합니다.
그렇다면 왜 write!가 따로 존재할까요? 이유는 다음과 같습니다:
write!가 필요한 진짜 이유format! 수준의 포맷팅 기능을 push_str처럼 효율적으로 사용하고 싶을 때use std::fmt::Write;
let mut s = String::new();
let name = "Rust";
let ver = 2021;
write!(&mut s, "Hello, {} {}!\n", name, ver).unwrap();
format!과 동일한 포맷 문법 지원)String을 생성하지 않고 기존 String에 직접 추가 → 성능상 훨씬 유리write!는 format!과 push_str의 장점을 결합한 형태String 말고도 다른 출력 버퍼에 쓸 수 있음write!는 std::fmt::Write 트레잇을 기반으로 하므로,
다양한 출력 대상에 포맷된 데이터를 쓸 수 있습니다.
예:
fn render_html(output: &mut dyn std::fmt::Write) {
write!(output, "<h1>Hello</h1>").unwrap();
}
String, &mut String, &mut MyWriter 등 어떤 버퍼든 받음write!는 format_args!와 함께 작동하여 안정성, 안전성, 성능 최적화가 검증된 방식{}와 인자 개수 불일치 시 에러)| 기능 | push_str | write! |
|---|---|---|
| 단순 문자열 추가 | ✅ 빠르고 간단 | ⛔ 불필요하게 복잡 |
| 포맷팅 지원 | ❌ 없음 | ✅ format!과 동일한 문법 지원 |
| 다양한 출력 대상 지원 | ❌ String에만 적용 | ✅ 모든 fmt::Write 대상 가능 |
| 효율성 | 🥇 가장 빠름 | 🥈 아주 빠름 + 포맷 지원 |
| 반복 포맷에 적합 | ❌ | ✅ 특히 반복 렌더링에 적합 |
push_strwrite!write!가 성능/가독성 모두 우수💡 write!는 format!보다 성능이 훨씬 좋고, push_str보다 표현력이 좋기 때문에 중간 단계 역할로 매우 유용합니다.
필요하시면 실제 성능 비교 벤치마크 코드를 제공해드릴 수 있습니다.