build-performance

1 개의 포스트

소개: Figma to React | 피 (새 탭에서 열림)

Figma는 비대해진 C++ 코드베이스로 인한 긴 빌드 시간을 단축하여 개발자의 피드백 루프를 개선하고 생산성을 극대화하는 성과를 거두었습니다. 단순히 고사양 하드웨어를 도입하는 것에 그치지 않고, 빌드 과정의 병목을 정밀하게 측정하고 헤더 구조 최적화 및 분산 빌드 시스템을 도입하여 빌드 속도를 획기적으로 개선했습니다. 이러한 노력은 결과적으로 대규모 코드 수정 시에도 개발자가 신속하게 결과를 확인할 수 있는 쾌적한 엔지니어링 환경을 구축하는 결론으로 이어졌습니다. **빌드 데이터 시각화와 병목 지점 파악** - Clang의 `-ftime-trace` 플래그를 활용하여 각 소스 파일의 컴파일 과정과 템플릿 인스턴스화에 소요되는 시간을 상세하게 데이터화했습니다. - 수집된 JSON 데이터를 Chrome 브라우저의 `about:tracing` 도구로 시각화하여, 어떤 헤더 파일이 반복적으로 파싱되고 있는지 또는 특정 템플릿이 얼마나 많은 시간을 잡아먹는지 직관적으로 분석했습니다. - 이를 통해 막연한 추측이 아닌, 실제 수치에 기반하여 최적화 우선순위를 결정할 수 있는 기틀을 마련했습니다. **헤더 의존성 관리 및 전방 선언 활용** - 헤더 파일 내에 불필요하게 포함된 다른 헤더들을 제거하고, 실제 구현 파일(.cpp)에서만 포함하도록 구조를 변경했습니다. - '전방 선언(Forward Declaration)'을 적극적으로 사용하여 헤더 간의 복잡한 의존성 연결 고리를 끊어냄으로써, 특정 헤더 변경 시 재컴파일되는 파일의 숫자를 최소화했습니다. - 'Include What You Use(IWYU)' 원칙을 적용하여 각 파일이 컴파일에 꼭 필요한 최소한의 심볼만 참조하도록 정돈했습니다. **Unity Build와 Precompiled Headers (PCH)** - 여러 개의 소스 파일을 하나의 큰 컴파일 단위로 묶는 'Unity Build' 기법을 도입하여, 동일한 헤더가 수천 번 반복해서 파싱되는 오버헤드를 줄였습니다. - 표준 라이브러리(STL)나 외부 라이브러리처럼 변경이 거의 없는 무거운 헤더들을 'Precompiled Headers(PCH)'로 구성하여 빌드 초기 단계에서 한 번만 처리되도록 최적화했습니다. **분산 빌드 인프라 및 캐싱 적용** - 로컬 머신의 CPU 코어 수 한계를 극복하기 위해 Google의 `Goma`나 `Remote Build Execution(RBE)`와 같은 분산 컴파일 시스템을 구축했습니다. - 수백 대의 원격 서버 노드에 컴파일 작업을 분산시켜 수천 개의 파일을 동시에 처리함으로써 전체 빌드 시간을 물리적으로 단축했습니다. - `ccache`와 같은 컴파일러 캐시 도구를 병행 사용하여, 코드가 변하지 않은 부분에 대해서는 이전 빌드 결과를 재사용함으로써 불필요한 연산을 제거했습니다. **지속적인 빌드 성능 모니터링** - 빌드 시간 최적화는 일회성 작업으로 끝나지 않도록, CI(지속적 통합) 단계에서 빌드 시간을 모니터링하고 성능 저하가 발생할 경우 이를 추적하는 체계를 구축했습니다. - 템플릿 메타프로그래밍의 과도한 사용을 경계하고, 복잡한 템플릿 구조가 빌드 성능에 미치는 영향을 코드 리뷰 과정에서 검토하는 문화를 형성했습니다. C++ 프로젝트의 규모가 커질수록 빌드 시간은 기하급수적으로 늘어날 수 있으므로, 초기부터 `-ftime-trace`를 통한 시각화 습관을 들이는 것이 중요합니다. 특히 헤더 의존성을 느슨하게 유지하고 분산 빌드 환경을 구축하는 것은 대규모 팀의 개발 속도를 유지하기 위한 필수적인 투자입니다.