GO · 성능
슬라이스 사전 할당
make([]T, 0, cap)으로 슬라이스 용량을 미리 확보하여 재할당을 방지합니다.
성능중급preallocslicecapacityperformance
핵심 설명
make([]T, 0, cap)으로 슬라이스 용량을 미리 확보하여 재할당을 방지합니다.
Go code
package main
import (
"fmt"
"testing"
)
func withoutPrealloc(n int) []int {
var s []int // cap=0
for i := 0; i < n; i++ {
s = append(s, i) // 용량 초과 시 매번 재할당
}
return s
}
func withPrealloc(n int) []int {
s := make([]int, 0, n) // cap=n
for i := 0; i < n; i++ {
s = append(s, i) // 재할당 없음
}
return s
}
func BenchmarkWithout(b *testing.B) {
for i := 0; i < b.N; i++ {
withoutPrealloc(10000)
}
}
func BenchmarkWith(b *testing.B) {
for i := 0; i < b.N; i++ {
withPrealloc(10000)
}
}
func main() {
s1 := withoutPrealloc(8)
s2 := withPrealloc(8)
fmt.Printf("미할당: len=%d, cap=%d\n", len(s1), cap(s1))
fmt.Printf("사전할당: len=%d, cap=%d\n", len(s2), cap(s2))
// 변환 시 사전 할당
src := []int{1, 2, 3, 4, 5}
dst := make([]string, 0, len(src))
for _, n := range src {
dst = append(dst, fmt.Sprint(n))
}
fmt.Println(dst)
}학습 팁
입력 크기를 알 때는 항상 make([]T, 0, len)으로 사전 할당하세요. prealloc 린터가 이를 자동 감지합니다.
주의할 점
make([]int, n)은 길이 n짜리 슬라이스를 만듭니다(모두 0). append하면 뒤에 추가되어 크기가 2n이 됩니다.
자주 묻는 질문
슬라이스 사전 할당란 무엇인가요?
make([]T, 0, cap) 으로 슬라이스 용량을 미리 확보하여 재할당을 방지합니다.
슬라이스 사전 할당 학습 시 주의할 점은 무엇인가요?
make([]int, n) 은 길이 n짜리 슬라이스를 만듭니다(모두 0). append 하면 뒤에 추가되어 크기가 2n이 됩니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.