PHpullh
학습 라이브러리/Go/메모리 할당 최적화

GO · 성능

메모리 할당 최적화

불필요한 힙 할당을 줄여 GC 압력을 낮춥니다. 슬라이스, 맵, 문자열 빌더의 사전 할당을 다룹니다.

성능중급allocationpreallocgcoptimization

핵심 설명

불필요한 힙 할당을 줄여 GC 압력을 낮춥니다. 슬라이스, 맵, 문자열 빌더의 사전 할당을 다룹니다.

Go code

package main

import (
	"fmt"
	"strings"
)

func main() {
	n := 10000

	// 나쁜 예: 반복적 재할당
	s1 := make([]int, 0)
	for i := 0; i < n; i++ {
		s1 = append(s1, i) // 용량 초과 시 매번 재할당
	}

	// 좋은 예: 사전 할당
	s2 := make([]int, 0, n)
	for i := 0; i < n; i++ {
		s2 = append(s2, i) // 재할당 없음
	}

	// 맵 사전 할당
	m := make(map[string]int, n) // 힌트 제공
	for i := 0; i < n; i++ {
		m[fmt.Sprintf("key%d", i)] = i
	}

	// 문자열 빌더 사전 할당
	var sb strings.Builder
	sb.Grow(n * 10) // 예상 크기만큼 미리 할당
	for i := 0; i < n; i++ {
		fmt.Fprintf(&sb, "item%d,", i)
	}

	fmt.Printf("슬라이스: len=%d, cap=%d\n", len(s2), cap(s2))
	fmt.Printf("맵: len=%d\n", len(m))
	fmt.Printf("문자열: len=%d\n", sb.Len())
}

학습 팁

make([]T, 0, n)으로 사전 할당하면 append 시 재할당이 발생하지 않아 GC 압력이 줄어듭니다.

주의할 점

make([]T, n)은 길이 n으로 초기화합니다(제로 값 채움). make([]T, 0, n)은 빈 슬라이스에 용량만 확보합니다.

자주 묻는 질문

메모리 할당 최적화란 무엇인가요?

불필요한 힙 할당을 줄여 GC 압력을 낮춥니다. 슬라이스, 맵, 문자열 빌더의 사전 할당을 다룹니다.

메모리 할당 최적화 학습 시 주의할 점은 무엇인가요?

make([]T, n) 은 길이 n으로 초기화합니다(제로 값 채움). make([]T, 0, n) 은 빈 슬라이스에 용량만 확보합니다.