다음을 통해 공유


NGen을 사용하여 시작 성능 향상

참고 항목

EF6 이상만 - 이 페이지에서 다루는 기능, API 등은 Entity Framework 6에 도입되었습니다. 이전 버전을 사용하는 경우 이 정보의 일부 또는 전체가 적용되지 않습니다.

.NET Framework는 애플리케이션을 더 빠르게 시작하고 경우에 따라 메모리를 적게 사용하는 데 도움이 되도록 관리 애플리케이션 및 라이브러리에 대한 네이티브 이미지 생성을 지원합니다. 네이티브 이미지는 애플리케이션이 실행되기 전에 관리 코드 어셈블리를 네이티브 컴퓨터 명령이 포함된 파일로 변환하여 만들어지므로 .NET JIT(Just-In-Time) 컴파일러가 애플리케이션 런타임에서 네이티브 지침을 생성할 필요가 없습니다.

버전 6 이전에는 EF 런타임의 핵심 라이브러리가 .NET Framework 일부였으며 네이티브 이미지가 자동으로 생성되었습니다. 버전 6부터 전체 EF 런타임이 EntityFramework NuGet 패키지에 결합되었습니다. 이제 비슷한 결과를 얻으려면 NGen.exe 명령줄 도구를 사용하여 네이티브 이미지를 생성해야 합니다.

경험적 관찰을 통해 EF 런타임 어셈블리의 네이티브 이미지가 애플리케이션 시작 시간을 1~3초 간 줄일 수 있다는 것을 확인할 수 있습니다.

NGen.exe 사용 방법

NGen.exe 도구의 가장 기본적인 기능은 어셈블리 및 모든 직접 종속성에 대한 네이티브 이미지의 "설치"(즉, 디스크에 만들고 유지)입니다. 이를 달성할 수 있는 방법은 다음과 같습니다.

  1. 관리자 권한으로 명령 프롬프트를 엽니다.

  2. 현재 작업 디렉터리를 네이티브 이미지를 생성하려는 어셈블리의 위치로 변경합니다.

    cd <*Assemblies location*>  
    
  3. 운영 체제 및 애플리케이션의 구성에 따라 32비트 아키텍처, 64비트 아키텍처 또는 둘 다에 대한 네이티브 이미지를 생성해야 할 수 있습니다.

    32비트 실행의 경우:

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>  
    

    64비트 실행의 경우:

    %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>  
    

잘못된 아키텍처에 대한 네이티브 이미지를 생성하는 것은 매우 일반적인 실수입니다. 의심스러운 경우 컴퓨터에 설치된 운영 체제에 적용되는 모든 아키텍처에 대한 네이티브 이미지를 생성할 수 있습니다.

NGen.exe는 설치된 네이티브 이미지 제거 및 표시, 여러 이미지 생성 큐 등과 같은 다른 기능도 지원합니다. 사용량에 대한 자세한 내용은 NGen.exe 설명서를 참조하세요.

NGen.exe를 사용하는 경우

EF 버전 6 이상을 기반으로 애플리케이션에서 네이티브 이미지를 생성할 어셈블리를 결정할 때는 다음 옵션을 고려해야 합니다.

  • 주 EF 런타임 어셈블리인 EntityFramework.dll: 일반적인 EF 기반 애플리케이션은 시작 시 또는 데이터베이스에 대한 첫 번째 액세스 시 이 어셈블리에서 상당한 양의 코드를 실행합니다. 따라서 이 어셈블리의 네이티브 이미지를 만들면 시작 성능이 가장 크게 향상됩니다.
  • 애플리케이션에서 사용하는 모든 EF 공급자 어셈블리: 이러한 네이티브 이미지를 생성하면 시작 시 약간의 이점이 있을 수 있습니다. 예를 들어 애플리케이션이 SQL Server용 EF 공급자를 사용하는 경우 EntityFramework.SqlServer.dll에 대한 네이티브 이미지를 생성하려고 합니다.
  • 애플리케이션의 어셈블리 및 기타 종속성: NGen.exe 설명서에서는 네이티브 이미지를 생성할 어셈블리를 선택하는 일반적인 조건과 네이티브 이미지가 보안에 미치는 영향, "하드 바인딩"과 같은 고급 옵션, 디버깅 및 프로파일링 시나리오에서 네이티브 이미지 사용과 같은 시나리오 등을 다룹니다.

네이티브 이미지를 사용하는 것이 애플리케이션의 시작 성능과 전반적인 성능 모두에 미치는 영향을 신중하게 측정하고 실제 요구 사항과 비교해야 합니다. 네이티브 이미지는 일반적으로 시작 성능 향상 및 경우에 따라 메모리 사용량을 줄이는 데 도움이 되지만 모든 시나리오에서 동일하게 이점이 있는 것은 아닙니다. 예를 들어 안정적인 상태 실행(즉, 애플리케이션에서 사용하는 모든 메서드가 한 번 이상 호출되면)에서 JIT 컴파일러에서 생성된 코드는 실제로 네이티브 이미지보다 성능이 약간 더 나을 수 있습니다.

개발 머신에서 NGen.exe 사용

개발 중에 .NET JIT 컴파일러는 자주 변경되는 코드에 대해 전반적인 최선의 절충을 제공합니다. EF 런타임 어셈블리와 같은 컴파일된 종속성에 대한 네이티브 이미지를 생성하면 각 실행 시작 시 몇 초를 줄여 개발 및 테스트를 가속화할 수 있습니다.

EF 런타임 어셈블리를 찾을 수 있는 좋은 위치는 솔루션에 대한 NuGet 패키지 위치입니다. 예를 들어 SQL Server .NET 4.5 이상을 대상으로 하는 EF 6.0.2를 사용하는 애플리케이션의 경우 명령 프롬프트 창에 다음을 입력할 수 있습니다(관리자 권한으로 여는 것이 좋음).

cd <Solution directory>\packages\EntityFramework.6.0.2\lib\net45
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll

참고 항목

이는 SQL Server용 EF 공급자에 대한 네이티브 이미지를 설치하면 기본 EF 런타임 어셈블리에 대한 네이티브 이미지도 기본적으로 설치된다는 점을 활용합니다. 이는 NGen.exe가 EntityFramework.dll이 동일한 디렉터리에 있는 EntityFramework.SqlServer.dll 어셈블리의 직접 종속성임을 감지할 수 있기 때문에 작동합니다.

설치 중 네이티브 이미지 만들기

WiX 도구 키트는 이 방법 가이드에 설명된 대로 설치 중에 관리 어셈블리에 대한 네이티브 이미지 생성 큐를 지원합니다. 또 다른 대안은 NGen.exe 명령을 실행하는 사용자 지정 설치 작업을 만드는 것입니다.

네이티브 이미지가 EF에 사용되는지 확인

확장명이 ".ni.dll" 또는 ".ni.exe"인 로드된 어셈블리를 찾아 특정 애플리케이션이 네이티브 어셈블리를 사용하고 있는지 확인할 수 있습니다. 예를 들어 EF의 주 런타임 어셈블리에 대한 네이티브 이미지는 EntityFramework.ni.dll이라고 합니다. 프로세스의 로드된 .NET 어셈블리를 검사하는 쉬운 방법은 프로세스 탐색기를 사용하는 것입니다.

알아야 할 기타 사항

어셈블리의 네이티브 이미지 만들기는 GAC(전역 어셈블리 캐시)에 어셈블리를 등록하는 경우와 혼동해서는 안 됩니다. NGen.exe는 GAC에 없는 어셈블리의 이미지를 만들 수 있으며, 실제로 특정 버전의 EF를 사용하는 여러 애플리케이션이 동일한 네이티브 이미지를 공유할 수 있습니다. Windows 8은 GAC에 배치된 어셈블리에 대한 네이티브 이미지를 자동으로 만들 수 있지만, EF 런타임은 애플리케이션과 함께 배포되도록 최적화되며, 어셈블리 해상도에 부정적인 영향을 미치고 다른 측면 간에 애플리케이션을 서비스하기 때문에 GAC에 등록하지 않는 것이 좋습니다.