A Developing Developer
JIT vs AOT 본문
- JIT (Just-In-Time)
- 소스코드를 프로그램 실행 시 즉석해서(런타임) 기계어로 컴파일하여 실행시키는 방식
- 주로 인터프리터 언어에서 프로그램 실행속도를 향상시키기 위해 사용하는 프로그램 실행 방식
- 프로그램 실행 방식
- 컴파일 방식 : 프로그램을 실행시키기 전 소스코드를 기계어로 컴파일하여 오브젝트 파일로 만들어 두고, 실행 시 오브젝트 파일의 기계어를 바로 실행 (Ex. C, C++, 등)
- 인터프리트 방식 : 프로그램이 시작되면, 소스코드를 진입점(main 함수 혹은 실행한 파일의 최상단 코드) 부터 한 줄씩 해석 (Ex. Python, 등)
컴파일 방식과 인터프리트 방식을 섞어 놓은 방식으로, 잘 만들어진 JIT 컴파일러를 사용하면 인터프리트 방식으로 실행되는 프로그램의 실행 속도로 컴파일 방식의 언어와 근사한 수준을 끌어 올릴 수 있음
[인터프리트 방식의 컴파일 방식의 실행 속도]
진입점에서부터 코드를 한 줄씩 기계어로 번역한다는 점에서 인터프리트 언어의 특성을 가지고 있기도 하고, 기계어로 번역된 코드를 어딘가에 저장해 둔다는 점에서 컴파일 언어의 특성을 가지고 있기도 함.
- Caching(캐싱) - 빈번히 실행되는 부분을 발견하면 그 부분의 번역 결과 기계어를 어디엔가 저장해 두고 필요할 때마다 꺼내와 사용
1) def f(a,b):
2) return a + b
3)
4) f(1,2)
5) f(3,4)
6) f(4,5)
- 인터프리트 방식 : 4 -> 1 -> 2 -> 5 -> 1 -> 2 -> 6 -> 1 -> 2
- JIT 방식 : 4 -> 1 -> 2 -> (Caching) -> 5 -> 6
[장점]
Caching을 통해 인터프리트 방식으로 실행되는 언어의 속도를 개선하여 컴파일 방식 프로그램 실행과 근사한 수준의 실행 속도를 낼 수 있게 해줌.
[단점]
프로그램의 실행 시간이 짧은 경우 인터프리트 방식과 속도의 근차이 없음
Caching 때문에 정적으로 컴파일 된 프로그램보다 실행 시 메모리를 많이 잡아 먹음
- AOT(Ahead of Time)
- 실행 전에 바이트 코드를 기계어로 바꾸는 컴파일러
- 실행 전에 모두 기계어로 변환되기 때문에 JIT 컴파일러가 런타임 컴파일 하기 때문에 발생하는 성능 이슈가 생기지않고 거의 네이티비브의 성능을 낼 수 있음
[장점]
JIT 컴파일러가 런타임 컴파일 하기 때문에 발생하는 성능 이슈가 생기지않고 거의 네이티비브의 성능을 낼 수 있음
[단점]
AOT 컴파일러를 사용하면 실행 전에 전체 파일을 빌드해야 하기 때문에 빌드 속도가 느려짐
설치할 때도 JIT 컴파일러를 사용하는 경우 바이트 코드만 받으면 되는 반면 AOT 컴파일러를 사용하면 기계어로 번역하는 작업까지 포함되기 때문에 느림.
JIT 컴파일러의 장점인 Hot Reload 기능도 사용 X
[결론]
개발 단계에 JIT 컴파일러를 이용해 수정사항이 빠르게 반영 될 수 있도록 만들고
프로덕션으로 배포하는 경우 AOT 방식으로 빌드해서 런타임 성능을 훼손하지 않도록 한다.
============================================================================================
출처 : https://velog.io/@developerkerry/Just-In-Time-Compile%EC%9D%B4%EB%9E%80
============================================================================================
출처 : https://selfish-developer.com/entry/AOTAhead-Of-Time-Compiler
'개발 상식' 카테고리의 다른 글
IoC 와 DI (0) | 2023.02.20 |
---|---|
JavaScript 에서 this 키워드 (0) | 2023.02.20 |
[Javscript] 호이스팅(Hoisting) (0) | 2022.11.28 |
개구간, 폐구간 (0) | 2022.11.23 |
seed value (0) | 2022.11.22 |