
핵심요약
쿠키런: 킹덤 서버의 스칼라 빌드 속도를 개선하기 위해 typeclass 인스턴스 배치 최적화와 build pipelining 적용 과정 및 트러블슈팅을 다룹니다.
Scala 빌드 속도 최적화: 쿠키런 킹덤 서버 사례
Typeclass 인스턴스 배치 최적화
- 문제점 및 해결 방안: 스칼라에서
typeclass인스턴스의 정의 위치는 컴파일러의 검색 시간에 큰 영향을 미칩니다. 컴패니언 오브젝트에 인스턴스를 정의함으로써typer페이즈 내 implicit 검색 시간을 유의미하게 단축할 수 있습니다. - 기술적 상세:
-Vstatistics:typer옵션을 통해typer페이즈의time spent in implicits를 분석하여 검색 시간 감소를 확인했습니다. 특히successful in scope대비successful of type항목의 비중 증가가 관찰되었습니다. - 검증 도구:
scala-profiling을 활용한 implicit search flamegraph는typeclass인스턴스 검색이 전체implicit검색 시간에서 차지하는 비중을 시각적으로 파악하는 데 도움을 줍니다. - 최적화 결과: 특정 서브 프로젝트의 컴파일 속도를 65초에서 45초로 1.44배 향상시켰습니다.
Build Pipelining 적용 및 트러블슈팅
- 핵심 개념:
sbt의 Build Pipelining 기능은 서브 프로젝트 간 의존성 컴파일 시, 이전 프로젝트의 전체 백엔드 컴파일(.class 파일)을 기다리지 않고 **프론트엔드 단계(pickler 페이즈)**에서 생성된 **Early Output(AST)**을 사용하여 다음 프로젝트의 컴파일을 병렬적으로 시작하게 합니다. - 매크로와의 상호작용: 스칼라 매크로는 컴파일 타임에 실행 가능한 코드를 필요로 하므로, 매크로 정의나 매크로 확장 시 사용자 정의 코드에 의존하는 경우
pipelining이 불가능합니다. 이는sbt디버그 로그나 컴파일 과정 관찰을 통해 감지할 수 있습니다. - 구현 세부사항:
exportPipelining := false설정을 통해 매크로 의존성 등으로 인해early output생성이 어려운 서브 프로젝트를 명시적으로 제외하여 순차적 컴파일을 유도해야 합니다. - 성능 영향:
typer페이즈의 소요 시간이 적을수록pipelining의 병렬성 이득이 커집니다. 킹덤 서버의 전체 프로젝트 컴파일 속도를 1.22배 빠르게 하는 데 기여했습니다.