Golang
문자열 만들기 - strings.Builder
초혼
2025. 2. 25. 16:41
+= 방식
hexNumber := ""
for i := 0; i < length; i++ {
hexNumber += string(hexChars[index])
}
- 매 반복마다 새로운 문자열을 생성합니다
- 문자열은 불변(immutable)이므로, 연결할 때마다 새로운 메모리 할당이 발생합니다
- 시간 복잡도: O(n²) - n은 문자열 길이
strings.Builder 방식
var sb strings.Builder
sb.Grow(length) // 미리 필요한 용량만큼 메모리 할당
for i := 0; i < length; i++ {
sb.WriteByte(hexChars[index])
}
- 내부적으로 바이트 슬라이스를 사용하여 메모리를 효율적으로 관리합니다
- 필요한 용량을 미리 할당하여 재할당을 방지합니다(Glow())
- 시간 복잡도: O(n)
벤치마크
func BenchmarkStringConcat(b *testing.B) {
for i := 0; i < b.N; i++ {
s := ""
for j := 0; j < 1000; j++ {
s += "a"
}
}
}
func BenchmarkStringBuilder(b *testing.B) {
for i := 0; i < b.N; i++ {
var sb strings.Builder
sb.Grow(1000)
for j := 0; j < 1000; j++ {
sb.WriteByte('a')
}
}
}
실행 결과
BenchmarkStringConcat-8 5124 ns/op 17408 B/op 999 allocs/op
BenchmarkStringBuilder-8 891 ns/op 1024 B/op 1 allocs/op
결론
반복적인 문자열 연산이 많은 경우에는 strings.Builder를 사용하는 것이 매우 유리