2009-06-26 5 views
3

우리 C# 클라이언트 응용 프로그램은 처음 실행시로드하는 데 항상 더 많은 시간이 걸립니다. 나는 지금까지 .NET 응용 프로그램의 첫 번째 실행 여부를 테스트하지 않았거나 .NET 응용 프로그램의 첫 실행이 느리긴하지만 어떤 경우에도 문제가 남아 있습니다. . 이 일회성 시동 히트를 어떻게 없앨 수 있습니까?.NET 응용 프로그램의 첫 번째 실행 성능을 어떻게 향상시킬 수 있습니까?

나의 초기 생각은 일종의 서비스가 라이브러리를 "워밍업"시킬 수 있다는 것입니다. 우리는 각 응용 프로그램 또는 모든 .NET 응용 프로그램에 대해이 작업을 수행해야합니까? 서비스를 실행하는 사용자가 차이를 만들겠습니까? 아마도 Windows 서비스가 아닌 Windows 로그인으로 실행되는 응용 프로그램이 더러운 작업을 수행 할 수 있습니까? 다시 말하지만 .NET 서비스만으로 충분할까요, 아니면 벌점을 없애기 위해 각 프로그램을 실행해야합니까? 프로그램이 즉시 종료되도록 명령 줄 매개 변수를 전달할 수는 있지만 충분할 수 있습니다. 또는 응용 프로그램의 정상적인 실행 중에 사용할 각 어셈블리를 .NET에로드해야할까요?


Re : 일부 답변은 릴리스 모드 DLL을 배포하고 있으며 속도 저하는 첫 번째 시작에서만 발생합니다. 우리는 가능한 한 클래스의 초기화를 지연하고 있습니다.

답변

4

다른 답변은 JIT 시간에 대해 이야기했지만 내 경험상 또 다른 매우 중요한 요소는 부팅 후 .NET Framework 자체를로드하는 데 걸리는 시간입니다.

절대적으로 사소한 프로그램을 작성해보십시오 (실제로는 실제 코드에서 사용하는 어셈블리에 적어도 부합하는 프로그램을 사용해보십시오). 그것을 컴파일하고 재부팅하십시오. 평범한 프로그램을 실행 한 다음 (끝나면) 실제 응용 프로그램을 실행하십시오. 사소한 응용 프로그램을 실행하지 않고 재부팅 한 후 실제 응용 프로그램을 실행하는 것과 어떻게 비교되는지보십시오.

+0

부팅 후. NET 프레임 워크를 워밍업하기 위해 어떤 솔루션을 제안하겠습니까? –

+1

좋은 아이디어는 다음과 같습니다. 대답에 이미 관심이있는 어셈블리를 다루는 사소한 프로그램을 작성하십시오. 다른 작업은 필요하지 않습니다. WinForms 앱으로 만들지 만 UI는 표시하지 않습니다. –

10

.net 응용 프로그램을 처음 실행할 때까지 기다릴 수있는 JIT (Just In Time 편집)입니다. 이것은 코드를 실행하기 전에 IL을 기계어 코드로 컴파일합니다. 이것이 처음으로 발생하는 이유는 기계 코드 버전이 디스크에 저장되어 재사용된다는 것입니다.

당신은 ... 당신의 응용 프로그램-JIT 사전 NGEN.EXE을 사용할 수 있습니다

이것은 JIT 컴파일하고 실행되고있는 CPU를 최적화하기 때문에, 당신이 소프트웨어를 실행하는 컴퓨터에서 수행해야합니다. 이 작업은 프로그램 설치의 일부로 수행 할 수 있습니다.

+2

Paint.NET http://getpaint.net은 설치 중에이 작업을 수행합니다. 잘 작동한다. – BoltBait

+0

아래에서 참조하는 페이지에서 "NGEN을 사용하는 경우 기본 이미지가 메모리에로드 될 때 리베이스가 발생할 수 있음을 알아야합니다.응용 프로그램의 일부로 둘 이상의 DLL을 빌드하는 경우 응용 프로그램이로드 될 때 모든 DLL에 할당 된 기본 기본 주소가 항상 동일하므로 (0x400000) 리베이스가 확실히 발생합니다. " 우리는 우리의 주요 응용 프로그램 (> 20). 우리는 여전히 이점을 볼 수 있습니까? –

+0

좋은 읽기, 감사합니다 ... 나는이 문제를 결코 알지 못했습니다 ... 그러나 기사에서 ("rebasing을 피하십시오"에서) 기본 주소를 diferently 설정할 수 있습니다. 나는 VS.NET 프로젝트 속성 -> 빌드 -> 아래로 스크롤 및 고급 단추를 클릭하십시오. 내 메모리를 바로 날을 제공하는 경우 해당 설정을 찾을 수 있습니다 ... (나는 20 + 어셈블리를 사용하는 것이 얼마나 실용적인지 모르겠다. 아마도 그걸 자동화 할 수 있을까?) –

1

MSIL을 원시 코드로 변환하는 .NET 런타임에 시작 지연이 있다고 느낍니다.

설치시 어셈블리를 ngen시킬 수 있습니다.이 어셈블리를 기본 코드로 컴파일하여 시작 지연을 방지 할 수 있습니다. WiX (http://wix.sourceforge.net)에는이를 수행하는 사용자 지정 작업이 있습니다.

3

가와 this (NGEN의 성능 이점) (.NET 프레임 워크 3.5 SP1에서 CLR 최적화) this (응용 프로그램 시작 시간 개선), this을 읽어보십시오.

시작 시간을 개선하기위한 주요 아이디어는 가능한 경우 지연된 초기화를 사용하는 것입니다. 시작 직후 불필요한 것을 인스턴스화하지 마십시오. 기타 등