2013-03-26 3 views
4

.NET Framework 2.0을 목표로 C#에서 간단한 Windows Forms 실행 파일을 만들었습니다 (간단히 말해서 약 20 개의 메서드가 있지만 하나의 창). 응용 프로그램이로드 될 때 생성자에서 기본값 인 InitializeComponent(); 이외의 작업을 수행하지 않습니다..NET을 처음으로 더 빠르게로드 할 수있게 만들기

처음 열면 응용 프로그램이 내 Windows 8에서로드하는 데 약 7 초 정도 걸립니다. 다음 번에 열 때 시간이 1 초도 안 걸립니다.

시도한 Windows XP에서 처음으로로드 할 때에 약 30 초가 걸립니다. 내 친구 중 몇 명이 응용 프로그램을 테스트 할 때 처음으로로드하는 데 많은 시간 (약 30 초)이 걸린다는 불평을합니다. 그런 다음 더 빨리 걸립니다 (1 초 또는 2 초).

.NET Framework가 아직로드되어 있지 않아 컴퓨터에로드하는 데 시간이 걸리기 때문에이 오류가 발생할 수 있다고 생각합니다.

.NET 응용 프로그램에서 같은 문제가 발생 했습니까?
이런 일이 발생하는 이유와 문제를 해결할 수있는 방법이 있습니까?

편집 - 일부 사람들이 NGEN을 제안하는 것으로 보입니다. 그러나 응용 프로그램을 사용할 모든 컴퓨터에서이 작업을 수행해야하는 경우이 작업을위한 솔루션이 될 수 없습니다. 내 응용 프로그램을 "일반 사용자"로 공개하려고합니다. 응용 프로그램을 사용하기 위해 추가 작업을해야하는 경우에는 말이되지 않습니다. .NET Framework가 필요하기 때문에 이미 충분히 나빠졌습니다. 내 응용 프로그램은 프레임 워크를 제외하고는 독립성이없는 독립 실행 형 EXE 여야합니다.

감사합니다.

+0

사용자의 RAM이 이미 고갈되어 앱을로드하기 전에 물건을 가상 메모리로 옮겨야 할 수 있습니다. NGEN은이 경우 많은 도움이되지 않습니다. – leppie

답변

5

이것은 CIT의 Just-In-Time 컴파일로 인해 발생했을 가능성이 큽니다. NGen을 사용하여 실행중인 환경의 코드를 컴파일 할 수 있습니다. 그러나이 경로를 따라 간다면 .Net의 플랫폼에 대한 불가지론을 잃을 가능성이 큽니다.

This blog entry (MSDN의 경우) NGen의 성능 이점에 대해 자세히 설명하고 있습니다.

업데이트 다음과 같은 의견하면 사용자 NGEN 응용 프로그램이 설치된되고 있다는 환경이 시점에서 실행할 수있는 설치 프로그램을 주면 로이드, 그의 대답에서 지적한대로

.

그러나 NGen을 사용할 수없는 경우 프로필러를 첨부하여 응용 프로그램을 시작하는 것이 좋습니다. 코드의 성능 병목 현상을 강조 표시 할 수 있습니다. 싱글 톤이나 값 비싼 정적 초기화 프로그램이있는 경우 이러한 옵션이 강조 표시되어 리팩터링 할 수 있습니다.

많은 훌륭한 닷넷 프로파일이 거기 (see this SO question for details)이있다가, 개인적으로 나는 dotTrace를 살펴 가진 권하고 싶습니다 - 그들은 또한 모든 응용 프로그램에 필요한 것있을 수 있습니다 한 달 동안 무료 체험 기간을 제공합니다.

+0

사이드 노트 : JIT와 관련이 있다고 생각하지 않습니다. 인스턴스 당입니다. 모든 DLL 및 기타 디스크 리소스를로드/캐싱하는 것처럼 보입니다. –

+0

도움 주셔서 감사합니다. 그러나 이것은 내 문제에 대한 좋은 해결책으로 보이지 않습니다. 제 질문에 편집을 참조하십시오. 건배. – Nuno

+0

@NunoPeralta Answer –

6

응용 프로그램이로드 될 때 .NET에서 사용할 NGEN을 사용하여 기본 이미지를 미리 생성해볼 수 있습니다.

여기에서 자세한 정보를 찾을 수 있습니다 - http://msdn.microsoft.com/en-GB/library/6t9t5wcf(v=vs.80).aspx

이이 플랫폼에 의존하지 일반적으로 양도 당신은 당신이 배포하는 각 시스템에서이 작업을 수행해야하므로.

+0

도와 주셔서 감사합니다. 그러나 이것은 내 문제에 대한 좋은 해결책으로 보이지 않습니다. 제 질문에 편집을 참조하십시오. 건배. – Nuno

+1

편집과 관련하여 적절한 설치 프로그램을 만들면 사용자가 아무 것도 할 필요가 없습니다. 사용자가 클릭하면 바로 NGEN을 실행하도록 지시합니다. – Lloyd

+1

Lloyd가 맞습니다. 설치시 NGEN .NET 어셈블리를 사용할 수 있습니다. WiX 툴킷 (www.wixtoolset.org)을 사용하거나 다른 많은 셋업 빌더와 함께 할 수도 있습니다. –

0

[...]. 표적으로하는 .NET Framework 2.0. 응용 프로그램이로드 될 때 기본 InitializeComponent() 이외의 작업은 수행하지 않습니다. 생성자에서.

사실 사실이 아닙니다. 또한 응용 프로그램은 유형을로드하고 정적 생성자를 초기화합니다.

성능 문제가있는 대부분의 경우 프로파일 러를 사용하기 만하면됩니다. 프로파일 러를 사용하는 것이 가장 쉽습니다. 통찰력. 사용할 수있는 몇 가지 옵션이 있습니다. 개인적으로, 나는 Red-Gate의 프로파일 러 팬이며 사용 가능한 시험판이 있습니다.

.NET Framework에서 이러한 상황이 변경된 것은 주목할만한 사실입니다. 2.0에서 원하는 성능을 얻을 수 없다면 다른 프레임 워크를 사용해보십시오. 허락하신다면, Windows XP는 거기에 작은 문제가 될 수 있습니다 ...

+0

답장을 보내 주셔서 감사합니다. 인용문에서 의미하는 바는 응용 프로그램의 시작 부분에서 "사용자 지정"처리를 수행하지 않는다는 것입니다. 모든 정적 인 것들이로드되어야한다는 것도 알고 있습니다. 그들은 단지 몇 가지, btw 있습니다. 왜 Windows XP는 작은 문제입니까? Windows XP 사용자가 여전히로드되어 있기 때문에 .NET FW 2.0을 "강제로"사용합니다. 불행히도 FW 4.5는 XP와 호환되지 않습니다. – Nuno

+1

내가 말한 것은. NET 4.0이 초기화가 '게으른'것으로 변경되는 반면, .NET 2.0은 '열망하는'초기화입니다. 간단히 말하면 : 응용 프로그램을 시작하기 전에 .NET 2.0에서 모든 유형 (및 통계)이 초기화되며 .NET 4.0에없는 것입니다. 빈 winforms 앱 초기화를로드하는 것은 꽤 빠를 것입니다. – atlaste

+0

유용한 의견을 보내 주셔서 감사합니다. 나는 그것에 대해 몰랐다. :) – Nuno

관련 문제