PHpullh
학습 라이브러리/Go/벤치마크 테스트 — testing.B

GO · 테스트

벤치마크 테스트 — testing.B

Go의 testing.B는 성능 벤치마크를 내장 지원합니다. go test -bench로 함수 실행 시간, 메모리 할당을 정밀 측정하고, b.Run으로 서브 벤치마크를 구성할 수 있습니다.

테스트중급benchmarktestingperformanceprofiling

핵심 설명

Go의 testing.B는 성능 벤치마크를 내장 지원합니다. go test -bench로 함수 실행 시간, 메모리 할당을 정밀 측정하고, b.Run으로 서브 벤치마크를 구성할 수 있습니다.

Go code

package main

import (
	"fmt"
	"strings"
	"testing"
)

// 벤치마크 대상 함수들
func ConcatPlus(strs []string) string {
	result := ""
	for _, s := range strs {
		result += s
	}
	return result
}

func ConcatBuilder(strs []string) string {
	var b strings.Builder
	for _, s := range strs {
		b.WriteString(s)
	}
	return b.String()
}

func ConcatJoin(strs []string) string {
	return strings.Join(strs, "")
}

// 벤치마크 테스트 (파일명: concat_test.go)
func BenchmarkConcatPlus(b *testing.B) {
	strs := make([]string, 100)
	for i := range strs {
		strs[i] = "hello"
	}
	b.ResetTimer() // 준비 시간 제외
	for i := 0; i < b.N; i++ {
		ConcatPlus(strs)
	}
}

func BenchmarkConcatBuilder(b *testing.B) {
	strs := make([]string, 100)
	for i := range strs {
		strs[i] = "hello"
	}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		ConcatBuilder(strs)
	}
}

func BenchmarkConcatJoin(b *testing.B) {
	strs := make([]string, 100)
	for i := range strs {
		strs[i] = "hello"
	}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		ConcatJoin(strs)
	}
}

// 서브 벤치마크로 크기별 비교
func BenchmarkConcat(b *testing.B) {
	sizes := []int{10, 100, 1000}
	for _, size := range sizes {
		strs := make([]string, size)
		for i := range strs {
			strs[i] = "x"
		}
		b.Run(fmt.Sprintf("Plus/%d", size), func(b *testing.B) {
			for i := 0; i < b.N; i++ {
				ConcatPlus(strs)
			}
		})
		b.Run(fmt.Sprintf("Builder/%d", size), func(b *testing.B) {
			for i := 0; i < b.N; i++ {
				ConcatBuilder(strs)
			}
		})
	}
}

// 메모리 할당 추적
func BenchmarkMemory(b *testing.B) {
	strs := make([]string, 100)
	for i := range strs {
		strs[i] = "test"
	}
	b.ReportAllocs() // 메모리 할당 보고
	for i := 0; i < b.N; i++ {
		ConcatBuilder(strs)
	}
}

// 실행: go test -bench=. -benchmem -count=3
func main() {
	fmt.Println("벤치마크 실행 방법:")
	fmt.Println("  go test -bench=. -benchmem")
	fmt.Println("  go test -bench=BenchmarkConcat -benchtime=5s")
	fmt.Println("  go test -bench=. -cpuprofile=cpu.prof")
}

학습 팁

b.ResetTimer()로 준비 작업 시간을 제외하고, b.ReportAllocs()로 메모리 할당 횟수를 측정하세요. -benchtime=5s로 측정 시간을 늘리면 더 안정적인 결과를 얻습니다.

주의할 점

벤치마크 루프 안에서 결과를 사용하지 않으면 컴파일러가 최적화로 코드를 제거할 수 있습니다. 패키지 레벨 변수에 결과를 저장하여 최적화를 방지하세요.

자주 묻는 질문

벤치마크 테스트 — testing.B란 무엇인가요?

Go의 testing.B 는 성능 벤치마크를 내장 지원합니다. go test -bench 로 함수 실행 시간, 메모리 할당을 정밀 측정하고, b.Run 으로 서브 벤치마크를 구성할 수 있습니다.

벤치마크 테스트 — testing.B 학습 시 주의할 점은 무엇인가요?

벤치마크 루프 안에서 결과를 사용하지 않으면 컴파일러가 최적화로 코드를 제거할 수 있습니다. 패키지 레벨 변수에 결과를 저장하여 최적화를 방지하세요.