Bun의 24분 Zig 빌드와 5분 Rust 빌드 차이를 추적하려 만든 buildprof
- 작성자는 Bun 1.3.14의 Zig 빌드와 1.4.0의 Rust 빌드를 6코어 12스레드 Linux VM에서 재현해 각각 24분 24초와 5분 40초를 측정함
- Bun이 공개한 Linux CI 중앙값도 Zig 시절 30분 6초, Rust 시절 5분 37초였으며 작성자의 단일 머신 재현 결과도 같은 격차를 보임
- 오픈소스 buildprof는
buildprof -- cargo build처럼 기존 빌드 명령 앞에 붙여 실행하고, 빌드가 시작한 모든 자식 프로세스의 시작과 종료를 기록해 하나의 타임라인으로 표시함 - 타임라인은 가로 폭으로 실행 시간을, 세로 계층으로 부모와 자식 프로세스 관계를 보여줘 Cargo, Make, Ninja, Zig 등 빌드 시스템별 통합 없이 컴파일러·링커·스크립트 작업을 함께 추적함
- Full LTO는 컴파일 단위를 하나의 큰 최적화 작업으로 모으는 반면 ThinLTO는 작업 분리를 유지해 상당 부분을 병렬 실행하므로, Bun의 빌드 시간 비교에서 언어 외에 검토할 차이로 제시됨
Hacker News opinions
글 좋았음. Zig 빌드가 Rust보다 훨씬 빨라지는 결론을 기대했는데, 그래도 깊이 파고든 과정은 재밌게 읽었음.
저녁과 주말 3주를 쏟아서 더 최적화할 기력이 없었음. Zig 모듈을 Rust처럼 약 100개로 쪼개는 게 답처럼 보였지만, Bun이 실제로 배포할 구성으로 대표성이 있는지는 의문이었음.
이런 최적화 실험을 LLM이 자동으로 하려면 어떤 입력이 제일 좋을지 궁금함. 시각화가 최선인지, 다른 형태의 데이터가 나은지도 알고 싶음.
buildprof 구조상 Perfetto trace processor에 SQL 몇 개를 얹으면 자동 보고서를 만드는 일은 아주 쉬움. AI가 빌드 시간을 기준으로 hill-climbing하는 것도 가능하겠지만, 왜 이런 일이 생기는지 사람이 이해하려면 시각 뷰가 여전히 필요하다고 봄.
이건 예전에 있던 독점 도구 Electric Insight가 생각남. 코어를 늘렸을 때 얼마나 빨라질지 추정하거나, 두 빌드를 비교해서 어떤 작업의 인자나 실행 여부가 달랐는지 분석할 수 있음.
빌드 간 diff는 꼭 넣고 싶은 기능임. 이미 buildprof 이슈 #12로 등록했고 구현 아이디어도 있음.
ElectricInsight 만든 사람인데, 아직 좋게 기억하는 사람이 있다니 반갑네.
컴파일 시간을 프로파일링하는 글이라 반가움. 나도 조잡한 도구를 만들었지만 이 정도로 종합적이고 보기 좋지는 않아서 써볼 생각임.
이 도구로 어제 만난 컴파일 시간 문제를 거의 바로 진단했음. 내 도구로는 아직 원인을 못 찾던 문제였음.
WebKit 링크 단계의 Full LTO가 직렬 구간인데, 이 시각화 도구는 링크 시간과 코드 생성 시간을 따로 보여주는지 궁금함.
맞음, 글 전체가 바로 그 부분을 다룸. --compiler-traces를 쓰면 lld가 제공하는 주석으로 링크 내부 과정도 볼 수 있음.