Bun의 컴파일 시간을 이해하려고 빌드 시각화 도구를 만들었다

10 hours ago 2

buildprof는 Linux 빌드 명령이 실행하는 모든 하위 프로세스를 하나의 타임라인으로 보여주는 오픈소스 추적 도구로, 병렬성 부족, 반복 작업, 의존성 다운로드, 오래 걸리는 컴파일과 링크 단계를 확인할 수 있음 Bun의 Zig 빌드를 추적한 결과, 전체 24분 24초 중 최종 링크가 16분 35초를 차지했으며, 링커 내부 추적에서 대부분의 시간이 Full LTO 작업에 쓰이는 것을 확인함 Bun뿐 아니라 미리 빌드해 내려받는 WebKit과 ICU까지 ThinLTO로 재빌드하자 Zig 빌드가 15분 11초로 줄어듦. 다만 대조군 실험이 없어 절감 시간 전체를 LTO 설정만의 효과로 돌릴 수는 없음 남은 큰 차이는 컴파일 구조였음. Rust 빌드는 90개가 넘는 크레이트로 나뉘지만 Zig 빌드는 단일 모듈에 집중돼 같은 방식으로 병렬화할 수 없었으며, 이 구조가 느린 링크까지 설명하는지는 입증하지 못함 프로세스 트리와 파일 읽기/쓰기 관계를 결합해 빌드 시스템 간 의존성을 추적하며, Clang과 LLD 등의 내부 실행 추적도 타임라인에 통합함. 파일을 많이 여는 빌드에서는 기록 오버헤드가 커질 수 있음 buildprof가 보여주는 빌드의 시간 buildprof는 Linux에서 소프트웨어 컴파일 시간이 어디에 쓰이는지 보여주는 오픈소스 도구임 기존 빌드 명령 앞에 buildprof --를 붙여 사용하며, Make, Cargo, Ninja, just, 사용자 정의 스크립트 등을 실행할 수 있음 빌드 명령이 생성한 프로세스와 모든 하위 프로세스를 기록하며, 가로축은 시간, 막대 너비는 실행 시간, 아래쪽 배치는 부모와 자식 관계를 나타냄 느린 빌드는 코드 양 자체 때문일 수도 있지만, 병렬성 부족과 반복 작업, 의존성 다운로드, 거대한 컴파일러/링커 호출처럼 수정 가능한 원인도 있음 타임라인으로 이런 작업을 드러내 조사하고 최적화할 대상을 찾도록 함 출발점은 Bun의 Rust 전환과 LTO 차이 Bun의 수석 아키텍트 Jarred Sumner가 새 Rust 빌드가 기존 Zig 빌드보다 Linux에서 5배 넘게 빠르다고 밝힌 게시물이 조사 계기가 됨 비슷한 복잡도의 프로젝트에서는 Zig가 Rust보다 훨씬 빨리 컴파일됐던 경험과 달랐음 언어 외에도 Zig 빌드는 Full LTO, Rust 빌드는 ThinLTO를 사용한다는 차이가 있었음 링크 시간 최적화(LTO) 는 컴파일 단위 경계를 넘어 최적화함 Full LT...

Read Entire Article