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 학습 시 주의할 점은 무엇인가요?
벤치마크 루프 안에서 결과를 사용하지 않으면 컴파일러가 최적화로 코드를 제거할 수 있습니다. 패키지 레벨 변수에 결과를 저장하여 최적화를 방지하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.