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의 제네릭 성능 개선은 실용적이었다. 프로덕션 배포 후 모니터링 결과도 벤치마크와 일치했다. 제네릭을 적극 활용하는 프로젝트라면 업그레이드를 권장한다.