PHpullh
학습 라이브러리/Go/슬라이스 사전 할당

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이 됩니다.