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
Amazon Bedrock AgentCore Runtime을 쉽고 빠르게 시작하기

Amazon Bedrock AgentCore Runtime을 쉽고 빠르게 시작하기

Enterprise Agentic AI를 위한 Amazon Bedrock AgentCore Built-in Tools: Code Interpreter and Browser Tool

Enterprise Agentic AI를 위한 Amazon Bedrock AgentCore Built-in Tools: Code Interpreter and Browser Tool