문제
.NET에서 작업하면 응용 프로그램 자체에 대한 일반적으로 좋은 성능을 제공하지만 응용 프로그램의 초기로드 시간은 상당히 큽니다. 그것의 많은 부분은 측정하기 어려운 로딩 어셈블리로갑니다.
GAC 또는 NGEN을 포함하지 않고 더 빨리로드 할 수 있도록 어셈블리에 적용 할 수있는 최적화가 있습니까?
이것은 WinForms 2.0 프로젝트입니다. 3.5로 업그레이드 할 수 있지만 사용자 기반을 제한합니다. 내 컴퓨터에 .NET Framework 3.5가 설치되어 있습니다.
해결책
스플래시 화면을 최대한 빨리 보여주는 아주 작은 .exe를 만들었습니다. 그 후 나는 모든 것을 초기화합니다.
JIT-Compiler는 Jitted가있는 방법에서 호출되는 모듈을로드합니다. 따라서 스플래시 화면을 표시하는 메소드가 아직로드를 원하지 않는 모듈에서 메소드를 호출하지 않도록주의해야합니다.
예시:
internal sealed class Startup {
// Call Startup.Run() from Program.Main to start the application
internal void Run() {
this.ShowSplash();
this.ContinueStartup();
}
private void ShowSplash() {
_splash = new Splash();
_splash.Show();
Application.DoEvents();
}
[MethodImpl(MethodImplOptions.NoInlining)]
private void ContinueStartup() {
// Do the startup here
}
}
methodimpl (methodimploptions.noinlining)]이 필요하므로 continuestartup () 메소드가 JIT에 의해 인쇄되지 않으므로 모듈이 너무 일찍로드되기 때문입니다.
다른 팁
Ilmerge를 사용하여 모든 어셈블리를 하나의 파일로 병합 할 수 있습니다. 하나의 파일을 메모리로 읽는 것이 더 빠릅니다. 10 파일을 읽습니다. 나는 당신이 거기에서 부하 속도가 실제로 개선 될 것이라고 의심하지만.
또한 다른 어셈블리에 대한 모든 참조를 제거하고 UI를 사용자에게로드 할 수 있으며, UI (타이핑 또는 기타)를 사용하는 동안 Assembly.Load를 사용하여 필요한 모든 어셈블리를 사전로드하고, 반사 및 저장을 사용하여 필요한 모든 기능 포인터를 가져 오십시오. 내부 회원에서. 이러한 방식으로 응용 프로그램이 훨씬 빠르게로드됩니다. 그러나 나는 어떤 제정신 인 사람이 이와 같은 최적화를 할 것이라고 생각하지 않습니다.
얼마나 많은 어셈블리를 가지고 있는지 설명해 주시겠습니까?
.NET가 필요할 때 어셈블리를 즉시로드합니다. 여러 어셈블리에서 앱을 분할하기로 결정할 수 있습니다. 어셈블리는 배포 전략, 보안 및 성과를 사용하여 나누어야합니다. 대부분의 앱은 3 계층 구조 (UI, 비즈니스, 데이터)로 나뉩니다.