T
TechInsights
목록으로
BackEnd•2024. 12. 17.

스칼라 컴파일 속도 빠르게 하기

데브시스터즈
데브시스터즈 Engineering Team
스칼라 컴파일 속도 빠르게 하기

핵심요약

원문 보기

쿠키런: 킹덤 서버의 스칼라 빌드 속도를 개선하기 위해 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배 빠르게 하는 데 기여했습니다.
#BackEnd#Infra
데브시스터즈
데브시스터즈

데브시스터즈 Engineering Team

기술 인사이트를 전달하는 공식 채널

You might also like

View all
아이지에이웍스 AI 에이전트 클레어: Amazon Bedrock 기반 Text-to-SQL/Chart 에이전트로 이룬 데이터 분석 혁신

아이지에이웍스 AI 에이전트 클레어: Amazon Bedrock 기반 Text-to-SQL/Chart 에이전트로 이룬 데이터 분석 혁신

100년 가는 프론트엔드 코드, SDK

100년 가는 프론트엔드 코드, SDK