AI Briefing

스칼라 컴파일 속도 높이기

·2024.12.17 09:00

companion object와 build pipelining으로 스칼라 빌드 속도를 개선했다.

Scala2sbt로 빌드하는 쿠키런: 킹덤 서버에서 컴파일 병목을 줄이기 위해 두 가지 개선을 적용했다.

첫 번째는 typeclass 인스턴스를 companion object에 두는 방식이다. 별도 traitextends 하거나 별도 objectimport하는 방식보다 typer 페이즈의 implicit 검색 비용이 줄었고, time spent in implicits가 크게 감소했다. 서브 프로젝트 기준으로 컴파일 시간은 약 65초에서 45초로 줄어 1.44배 빨라졌다.

프로파일링에서는 -Vstatistics:typer를 통해 phase별 시간을 확인했고, 특히 successful in scope, failed in scope가 크게 줄어든 반면 successful of type, failed of type은 소폭 늘어났다. implicit search flamegraph를 보면 어떤 타입 검색이 시간을 쓰는지도 더 자세히 추적할 수 있다.

두 번째는 build pipelining 적용이다. ThisBuild / usePipelining := true로 활성화할 수 있으며, 의존 서브 프로젝트를 .class까지 기다리지 않고 pickler/early output만으로 이어서 컴파일한다. 다만 macro가 얽히면 pipelining이 막힐 수 있어, 매크로 정의나 매크로 확장에 의존하는 프로젝트는 순차 컴파일이 필요하다.

  • 매크로 정의에 의존하면 sbt가 암묵적으로 순차 컴파일로 전환한다.
  • 매크로 확장에 사용자 코드가 필요하면 early output만으로는 부족하다.
  • 이런 경우 exportPipelining := false로 서브 프로젝트별 동작을 조절한다.
  • 디버그 로그에서 early output can't be made because of macros 같은 메시지로 원인을 확인할 수 있다.

최종적으로 build pipelining까지 포함해 전체 프로젝트 컴파일 속도는 1.22배 빨라졌다. 핵심은 typeclass 검색 비용을 줄여 typer 시간을 낮추고, 매크로 제약을 고려해 pipelining 가능한 의존성 구조로 나누는 것이다.

이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.

요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.