NGEN.exe, CrossGen.exe (Native Image Generator)

.NET의 CLS(Common Language Specification)을 준수하는 언어들(C#, VB etc…)은 컴파일 하게되면 MSIL(IL, CIL)로 변환되며 이 IL 덩어리들이 .NET 의 Assembly라고 알고 있습니다.

이 때 .NET Assembly를 실행하여 프로세스로 만들면 이 때부터 JIT Compiler가 동작하면서 호출되는 메서드들을 하나씩 빌드하여 사용한다고 알고 있습니다. JIT가 이런 방식이다보니, 그때 그때 JITing하여 최초 실행 시에는 오버헤드가 발생합니다.(체감되는 수준은 아님.)

전 이게 싫으면 AOT형식으로 처음부터 다 빌드해버리는 것이 다른 방식의 대체 방안이라고 생각했는데요, 이거 말고도 NGEN이라는게 있더군요. .NET Framework용이 NGEN이고 .NET Core용은 CrossGen 이라고 MSDN에서 봤습니다.

제가 대충 알기로 이미 IL화 된 .NET Assembly에 대하여 NGEN으로 네이티브 이미지로 만들면, JITing을 하지 않을 수 있도록 전부 사전에 NGEN으로 네이티브 이미지를 만들어, .NET 프로세스에서는 AOT처럼 별도의 오버헤드 없이 동작한다고 이해했습니다. 그리고 NGEN으로 .NET Assembly를 수정한 뒤에도 여전히 CLR에서 동작하여, 관리코드로 동작한다고 합니다. 물론 NGEN으로 .NET Assempbly를 수정했을 때는 참조지역성(Locality of reference)을 잃기 때문에 주의하라고 하긴 하더군요. 참조 지역성은 MPGO로 해결할 수 있다고 하는데…이것은 무슨말인지는 잘 모르겠습니다.

이 때

  1. NGEN의 원리가 사전에 JIT으로 발생할 수 있는 일들을 미리 JITing 하듯 호출해주어서 이런 네이티브 이미지가 되는 것인지
  2. 빌드 후 매번 NGEN-MPGO를 해주어야 하는지 궁금합니다. (파이프라인 같은 것으로 자동화는 불가능한지, 아니면 VS2019에서 빌드 후 자동으로 하게 한다거나)

위 두 가지가 궁금합니다. 노하우를 부탁드립니다!
이상입니다.

2개의 좋아요