"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 벤치마크 코드 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 벤치마크 코드 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 벤치마크 코드란?
벤치마크 코드는 Go 프로그램의 성능을 측정하기 위해 작성된 테스트 코드입니다. Go는 표준 라이브러리의 testing 패키지를 통해 성능 테스트를 지원하며, 이를 벤치마크 테스트라고 합니다. 벤치마크 코드를 작성하면 특정 함수나 코드 블록의 실행 속도 및 효율성을 평가할 수 있습니다.
벤치마크 코드의 특징
- 파일 이름: 벤치마크 코드는 _test.go로 끝나는 파일에 작성됩니다.
- 예: main_test.go
- 함수 이름: 벤치마크 함수는 Benchmark로 시작해야 합니다.
- 매개변수: testing.B 타입의 매개변수를 받습니다.
- 반복 실행: b.N 횟수만큼 테스트 루프를 반복하며, 실행 시간을 측정합니다.
벤치마크 코드의 형식
기본 형식
func BenchmarkFunctionName(b *testing.B) {
for i := 0; i < b.N; i++ {
// 성능을 측정할 코드
}
}
- b.N은 벤치마크 실행 횟수를 나타내며, Go의 벤치마크 러너가 자동으로 설정합니다.
- 실행 시간은 반복 횟수에 따라 평균값으로 계산됩니다.
벤치마크 코드 작성 예제
1. 간단한 벤치마크 테스트
package main
import (
"strings"
"testing"
)
func Concatenate(a, b string) string {
return a + b
}
func BenchmarkConcatenate(b *testing.B) {
for i := 0; i < b.N; i++ {
Concatenate("Hello", "World")
}
}
2. 다양한 입력값 테스트
다양한 크기의 입력값에 대해 성능을 측정할 수 있습니다.
func BenchmarkStringRepeat(b *testing.B) {
for _, size := range []int{10, 100, 1000, 10000} {
b.Run("Size="+string(size), func(b *testing.B) {
for i := 0; i < b.N; i++ {
strings.Repeat("a", size)
}
})
}
}
3. 메모리 할당 추적
b.ReportAllocs()를 호출하면 테스트 중 발생한 메모리 할당 수를 보고할 수 있습니다.
func BenchmarkMapCreation(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
_ = make(map[int]int, 1000)
}
}
벤치마크 실행
기본 실행
go test -bench=.
특정 벤치마크 실행
go test -bench=BenchmarkConcatenate
결과 예제
BenchmarkConcatenate-8 25720379 46.3 ns/op
- BenchmarkConcatenate-8: 실행한 벤치마크 이름 및 사용된 CPU 스레드 수.
- 25720379: 실행 횟수.
- 46.3 ns/op: 한 번 실행하는 데 걸린 평균 시간(나노초).
벤치마크와 최적화
1. 병목현상 파악
벤치마크 코드는 프로그램에서 가장 느린 부분(병목현상)을 찾아내는 데 도움을 줍니다. 이를 통해 최적화가 필요한 부분을 명확히 알 수 있습니다.
2. 다양한 구현 비교
같은 작업을 수행하는 다양한 구현을 비교하여 가장 효율적인 방법을 선택할 수 있습니다.
예제: 문자열 결합 성능 비교
func BenchmarkConcatWithOperator(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = "Hello" + "World"
}
}
func BenchmarkConcatWithStringsBuilder(b *testing.B) {
for i := 0; i < b.N; i++ {
var sb strings.Builder
sb.WriteString("Hello")
sb.WriteString("World")
_ = sb.String()
}
}
고급 기능
1. 하위 벤치마크
b.Run을 사용해 논리적으로 구분된 벤치마크를 작성할 수 있습니다.
func BenchmarkMathOperations(b *testing.B) {
b.Run("Addition", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = 1 + 1
}
})
b.Run("Multiplication", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = 2 * 2
}
})
}
2. 병렬 실행
b.RunParallel을 사용해 코드를 병렬로 실행하여 멀티코어 환경에서의 성능을 측정할 수 있습니다.
func BenchmarkParallelExecution(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_ = Concatenate("Hello", "World")
}
})
}
벤치마크 작성 시 주의사항
- 외부 종속성 최소화:
- 네트워크, 파일 시스템 등 외부 의존성이 포함되지 않도록 하세요.
- 벤치마크는 순수한 코드 성능만 측정해야 합니다.
- 초기화 작업 포함 금지:
- 초기화 작업은 벤치마크 실행 전에 수행해야 합니다.
- b.ResetTimer()를 사용해 초기화 작업 시간을 제외합니다.
func BenchmarkWithInitialization(b *testing.B) {
data := make([]int, 1000)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = len(data)
}
}
- GC(가비지 컬렉션) 영향 최소화:
- 벤치마크 실행 중 불필요한 메모리 할당을 피하십시오.
- b.ReportAllocs()로 메모리 사용량을 확인합니다.
결론
Go의 벤치마크 코드는 성능을 분석하고 최적화 기회를 찾아내는 데 강력한 도구입니다. 반복적인 실행과 정확한 시간 측정을 통해 프로그램의 성능 병목을 발견하고, 효율적인 코드를 작성할 수 있도록 도와줍니다. 기본적인 벤치마크 테스트에서 병렬 실행 및 메모리 할당 분석까지 다양한 기능을 활용하면 성능 개선에 큰 도움을 받을 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
'프로그래밍' 카테고리의 다른 글
👨💻 [Unreal] 언리얼 엔진에서 파티클 이펙트(Particle Effects) 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.13 |
---|---|
👨💻 [Go] Go 에서 프로파일링 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 테스트 코드 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 메서드 란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |
👨💻 [Go] Go 에서 함수란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.09 |