빠른 흐름
go test -bench=. -benchmem ./...
go test -bench=BenchmarkEncode -cpuprofile cpu.out
go tool pprof cpu.outGo 성능 점검은 benchmark로 재현하고, pprof로 어디서 시간을 쓰는지 확인하는 흐름이 기본입니다.
벤치마크
함수 이름은 BenchmarkXxx 형태다
func BenchmarkEncode(b *testing.B) {
for i := 0; i < b.N; i++ {
_, _ = Encode(sample)
}
}benchmark는 testing.B를 받고, 반복 횟수는 Go 테스트 러너가 b.N으로 조절합니다.
할당까지 보려면 -benchmem을 붙인다
go test -bench=. -benchmem ./internal/encoder실행 시간만 보면 놓치는 문제가 있습니다. -benchmem은 operation당 할당 횟수와 바이트를 같이 보여 줍니다.
준비 비용은 측정에서 빼야 한다
func BenchmarkParse(b *testing.B) {
data := loadFixture()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = Parse(data)
}
}fixture 로딩이나 테스트 데이터 생성이 측정 대상이 아니면 b.ResetTimer() 이후부터 재는 편이 정확합니다.
프로파일
CPU profile은 병목 함수를 찾는다
go test -bench=BenchmarkEncode -cpuprofile cpu.out
go tool pprof cpu.outpprof에서는 top, list, web 같은 명령으로 시간이 많이 쓰인 함수를 봅니다. 추측으로 고치기 전에 측정 결과로 병목을 좁히는 것이 핵심입니다.
HTTP 서버는 net/http/pprof를 붙일 수 있다
import _ "net/http/pprof"
go func() {
_ = http.ListenAndServe("localhost:6060", nil)
}()운영 서버에 붙일 때는 노출 범위가 중요합니다. profiling endpoint는 내부망, 인증, 임시 진단 환경처럼 접근 통제를 전제로 둡니다.
선택 기준
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 함수 성능 비교 | go test -bench |
| 할당 확인 | -benchmem |
| CPU 병목 추적 | -cpuprofile + go tool pprof |
| 메모리 사용 추적 | heap profile |
| 서버 런타임 진단 | net/http/pprof |
주의할 점
benchmark 결과는 실행 환경, 입력 데이터, compiler 최적화, 병렬 실행 여부에 영향을 받습니다. 한 번의 숫자보다 같은 조건에서 반복 측정한 변화량을 봐야 합니다. net/http/pprof를 외부에 그대로 노출하면 민감한 런타임 정보가 새어 나갈 수 있습니다.
참고 링크
3 sources