
코드 분리를 결정하고 리팩토링 후 다시 테스트를 진행하였을 때 갑자기 테스트 시간이 2.299초로

거의 2배 가량 늘어났다. 코드 구조 개선을 위한 리팩토링이었기에 이러한 성능 저하는 예상하지 못했다. 문제를 해결하고자 여러 방법을 시도한 후 다시 테스트를 진행했을 때, 기존과 동일한 정상 범위의 시간이 측정되었다. 이 현상의 원인을 찾아보기로 했다.
# 첫 실행 (콜드 스타트)
$ npm test
Time: 2.89s
# 바로 다시 실행 (웜 스타트)
$ npm test
Time: 1.32s
# 또 실행
$ npm test
Time: 1.41s
Jest의 콜드 스타트는 테스트를 처음 실행할 때 발생하는 초기 지연 현상을 의미한다.
첫 실행 시에는
1. Node.js 프로세스 시작
2. Jest 환경 초기화
3. 모든 모듈 파일 읽기 (디스크 I/O)
4. 코드 파싱 및 컴파일
5. 의존성 그래프 구축
6. 테스트 파일 수집 및 분석
위와 같은 이유로 시간이 소요된다. 반면 두 번째 실행부터는 웜 스타트 상태가 되어 훨씬 빠르게 실행된다.
1. OS 파일 시스템 캐시 활용 (메모리에서 읽음)
2. V8 엔진 최적화 코드 재사용
3. 모듈 resolution 결과 캐시 활용
이러한 캐싱 효과 덕분에 동일한 코드를 반복 실행할 때는 초기 실행보다 최대 50-100% 빠른 속도를 보인다.
Javascript 코드는 V8 엔진에 의해 실행 시점에 최적화 된다. V8은 코드를 처음 만났을 때 Ignition 인터프리터를 통해 바이트코드로 실행하지만, 자주 호출되는 함수(Hot function)을 감지하면 TurboFan JIT 컴파일러가 이를 네이티브 기계어로 최적화한다.
함수는 실행 빈도에 따라 세 가지 상태를 가지게 된다.