Go 1.23 제네릭 성능 개선 체감 후기
배경
사내 API 서버를 Go 1.22에서 1.23으로 업그레이드했다. 제네릭을 많이 사용하는 코드베이스라 성능 개선이 기대되었는데, 실제로 체감할 수 있는 수준이었다.
변경 사항
제네릭을 활용한 캐시 레이어를 구현한 부분에서 가장 큰 차이를 느꼈다.
type Cache[K comparable, V any] struct {
store sync.Map
}
func (c *Cache[K, V]) Get(key K) (V, bool) {
val, ok := c.store.Load(key)
if !ok {
var zero V
return zero, false
}
return val.(V), true
}
이전 버전에서는 제네릭 함수 호출 시 타입 체크 오버헤드가 있었는데, 1.23에서는 컴파일러 최적화가 개선되어 인라이닝이 더 적극적으로 일어났다.
측정 결과
벤치마크를 돌려본 결과:
- P95 응답 시간: 45ms → 38ms (약 15% 개선)
- 컴파일 시간: 23초 → 19초
- 바이너리 크기는 거의 동일
특히 제네릭 함수가 중첩되어 사용되는 부분에서 개선이 두드러졌다.
func Transform[T, U any](slice []T, fn func(T) U) []U {
result := make([]U, len(slice))
for i, v := range slice {
result[i] = fn(v)
}
return result
}
결론
Go 1.23의 제네릭 성능 개선은 실용적이었다. 프로덕션 배포 후 모니터링 결과도 벤치마크와 일치했다. 제네릭을 적극 활용하는 프로젝트라면 업그레이드를 권장한다.