닉스(Nix) 빌드 시스템, 캐싱으로 평가 속도 획기적 개선!

by DD
3개월 전
조회수 10

닉스(Nix)의 느린 평가 속도(Slow Evaluation)는 대규모 모노레포(Monorepo) 환경에서 CI 시간을 증가시키는 주요 문제로 지적됨

Garn 프로젝트는 TypeScript를 사용하여 닉스(Nix)의 프론트엔드를 구현하고, 평가 속도 향상(Performance Improvement)을 시도함

Garn은 파일 읽기(readFile) 및 경로(path) 함수를 추적하여 캐싱 효율성(Caching Efficiency)을 높이고, 불필요한 캐시 무효화를 방지함

커뮤니티에서는 닉스(Nix)의 평가 속도 개선에 대한 높은 관심(High Interest)을 보이며, Lix 프로젝트의 개선 방향에 대한 논의가 진행됨

Garn의 TypeScript 기반 평가 시스템

Garn은 닉스(Nix)의 느린 평가 속도 문제를 해결하기 위해 TypeScript를 프론트엔드 언어로 채택했다. V8 샌드박스(V8 Sandbox)를 활용하여 파일 읽기(readFile) 및 경로(path) 함수를 제공하며, 부수 효과(Side Effects)를 최소화하여 순수하고 결정적인 언어로 설계했다. 특히, Garn.lock 파일과 읽기 파일에 기반한 캐싱 메커니즘을 통해 평가 속도를 대폭 향상시켰다.

캐싱 메커니즘을 통한 빌드 시간 단축

Garn은 garn.ts 파일의 해시와 평가 과정에서 발생하는 모든 파일 읽기를 기록하여 캐싱 효율성을 높였다. 변경 사항이 없는 경우, 캐시된 값을 반환하여 빌드 시간을 단축한다. 닉스(Nix)의 경우, 리포지토리(Repository)의 변경 사항 발생 시 모든 캐시가 무효화되는 반면, Garn은 실제 의존성(Actual Dependencies)에 따라 캐시를 관리하여 불필요한 캐시 무효화를 방지한다.

성능 벤치마크 결과 분석

Garn은 벤치마크를 통해 닉스(Nix)에 비해 뛰어난 성능을 입증했다. garn.ts 파일 변경 시 16.8ms, default.nix 파일 변경 시 865.7ms, flake.nix 파일 변경 시 213.2ms의 평균 시간을 기록했다. 이는 닉스(Nix)의 877.1ms, 1.603s에 비해 현저히 빠른 속도이다. 특히, README.md 파일 변경 시에도 캐시를 유지하여 빌드 시간을 단축하는 효과를 보였다.

향후 개선 방향 및 커뮤니티 논의

Garn은 memoize 함수를 통해 사용자 정의 가능한 점진적 빌드(Incremental Build)를 지원하고, getTarget 함수를 통해 캐시 공유 문제를 해결할 수 있는 가능성을 제시했다. 또한, buildPackageBuilder 함수를 활용하여 설정 파일(config files) 변경에 따른 캐시 무효화를 최소화하는 방안을 모색하고 있다. 커뮤니티에서는 Lix 프로젝트의 평가 속도 개선을 위한 다양한 아이디어가 논의되고 있다.

Forwardly-evaluated build systems

댓글 0

첫 번째 댓글을 남겨보세요!