Czas uruchamiania aplikacjiApplication Startup Time

Ilość czasu, która jest wymagana dla aplikacji WPF rozpocząć może się znacznie różnić.The amount of time that is required for a WPF application to start can vary greatly. W tym temacie opisano różne techniki skracanie czasu uruchamiania postrzegany wartość rzeczywista dla aplikacji Windows Presentation Foundation (WPF).This topic describes various techniques for reducing the perceived and actual startup time for a Windows Presentation Foundation (WPF) application.

Opis zimnego uruchamiania i uruchamiania bez wyłączania zasilaniaUnderstanding Cold Startup and Warm Startup

Podczas zimnego uruchamiania występuje, gdy aplikacja uruchamia się po raz pierwszy po ponownym uruchomieniu systemu lub podczas uruchamiania aplikacji zamknij go, a następnie uruchom go ponownie po długim okresie czasu.Cold startup occurs when your application starts for the first time after a system reboot, or when you start your application, close it, and then start it again after a long period of time. Podczas uruchamiania aplikacji, jeśli wymagane stron (kod, dane statyczne, rejestru itp.) nie są obecne na liście wstrzymania Windows Menedżer pamięci, występują błędy stron.When an application starts, if the required pages (code, static data, registry, etc) are not present in the Windows memory manager's standby list, page faults occur. Dostęp do dysku jest wymagana do wprowadzenia strony w pamięci.Disk access is required to bring the pages into memory.

Bez wyłączania zasilania uruchamiania występuje, gdy większość na stronach głównych składników środowiska uruchomieniowego (języka wspólnego CLR) języka wspólnego zostały już załadowane w pamięci, co pozwala zaoszczędzić czas dostępu drogich dysków.Warm startup occurs when most of the pages for the main common language runtime (CLR) components are already loaded in memory, which saves expensive disk access time. Właśnie dlatego aplikacji zarządzanej rozpoczyna się szybciej, gdy jest uruchamiany po raz drugi.That is why a managed application starts faster when it runs a second time.

Implementowanie ekran powitalnyImplement a Splash Screen

W przypadkach, gdy jest istotne, nieuniknione opóźnienie między uruchomieniem aplikacji oraz wyświetlanie pierwszego interfejsu użytkownika, optymalizowanie czasu uruchamiania postrzegany przy użyciu ekran powitalny.In cases where there is a significant, unavoidable delay between starting an application and displaying the first UI, optimize the perceived startup time by using a splash screen. Ta metoda Wyświetla obraz niemal natychmiast po użytkownik uruchamia aplikację.This approach displays an image almost immediately after the user starts the application. Gdy aplikacja jest gotowa do wyświetlenia jego pierwszego interfejsu użytkownika, stopniowo zmienia się na ekranie powitalnym.When the application is ready to display its first UI, the splash screen fades. Począwszy od .NET Framework 3.5 SP1, można użyć SplashScreen klasy do zaimplementowania ekran powitalny.Starting in the .NET Framework 3.5 SP1, you can use the SplashScreen class to implement a splash screen. Aby uzyskać więcej informacji, zobacz dodać ekran powitalny do aplikacji WPF.For more information, see Add a Splash Screen to a WPF Application.

Możesz również wdrożyć ekranu powitalnego za pomocą natywnego grafiki Win32.You can also implement your own splash screen by using native Win32 graphics. Wyświetlanie implementacji przed Run metoda jest wywoływana.Display your implementation before the Run method is called.

Analizowanie kodu startowegoAnalyze the Startup Code

Ustal przyczynę powolne zimnego uruchamiania.Determine the reason for a slow cold startup. We/Wy dysku mogą być odpowiedzialne, ale nie zawsze jest to wymagane.Disk I/O may be responsible, but this is not always the case. Ogólnie rzecz biorąc należy zminimalizować użycie zasobów zewnętrznych, takich jak sieci, usługi sieci Web lub na dysku.In general, you should minimize the use of external resources, such as network, Web services, or disk.

Przed testowaniem, sprawdź, czy nie inne uruchomione aplikacje lub usługi używają kodu zarządzanego lub kodu WPF.Before you test, verify that no other running applications or services use managed code or WPF code.

Uruchomić aplikację WPF, natychmiast po ponownym uruchomieniu i określ, jak długo trwa do wyświetlenia.Start your WPF application immediately after a reboot, and determine how long it takes to display. W przypadku znacznie szybciej wszystkich kolejnych uruchomień aplikacji (uruchomienia bez wyłączania zasilania) problem podczas zimnego uruchamiania najprawdopodobniej spowodowane przez operacje We/Wy.If all subsequent launches of your application (warm startup) are much faster, your cold startup issue is most likely caused by I/O.

Jeśli aplikacja zimnego uruchamiania nie dotyczy problem operacji We/Wy, jest prawdopodobne, że Twoja aplikacja działa niektóre długich inicjowania lub obliczenie i czeka na niektóre zdarzenia ukończyć, lub wymaga dużo kompilacja JIT przy uruchamianiu.If your application's cold startup issue is not related to I/O, it is likely that your application performs some lengthy initialization or computation, waits for some event to complete, or requires a lot of JIT compilation at startup. W następujących sekcjach opisano niektóre z tych sytuacji bardziej szczegółowo.The following sections describe some of these situations in more detail.

Optymalizowanie ładowania modułuOptimize Module Loading

Użyj narzędzi takich jak Eksplorator procesów (Procexp.exe) i Tlist.exe, aby określić, które moduły aplikacja ładuje.Use tools such as Process Explorer (Procexp.exe) and Tlist.exe to determine which modules your application loads. Polecenie Tlist <pid> Wyświetla wszystkie moduły, które są ładowane przez proces.The command Tlist <pid> shows all the modules that are loaded by a process.

Na przykład jeśli nie jest nawiązywane w sieci Web jest ładowany System.Web.dll, a następnie w aplikacji jest moduł, odwołuje się do tego zestawu.For example, if you are not connecting to the Web and you see that System.Web.dll is loaded, then there is a module in your application that references this assembly. Sprawdź, czy jest to konieczne.Check to make sure that the reference is necessary.

Jeśli aplikacja ma wiele modułów, scalić w pojedynczym module.If your application has multiple modules, merge them into a single module. Takie podejście wymaga mniejsze koszty ładowania zestawu CLR.This approach requires less CLR assembly-loading overhead. Mniejszej liczby zestawów także oznaczać, że środowisko CLR utrzymuje mniej stanu.Fewer assemblies also mean that the CLR maintains less state.

Odroczenie inicjowania operacjiDefer Initialization Operations

Należy wziąć pod uwagę odracza kod inicjujący aż po wyrenderowaniu okna głównego aplikacji.Consider postponing initialization code until after the main application window is rendered.

Należy pamiętać, że może być wykonana inicjalizacji w konstruktorze klasy, a kod inicjujący odwołuje się do innych klas, może spowodować efektu kaskadowego, w którym są wykonywane wiele konstruktorów klas.Be aware that initialization may be performed inside a class constructor, and if the initialization code references other classes, it can cause a cascading effect in which many class constructors are executed.

Należy unikać konfiguracji aplikacjiAvoid Application Configuration

Należy wziąć pod uwagę, unikając konfiguracji aplikacji.Consider avoiding application configuration. Na przykład jeśli aplikacja ma prostej konfiguracji wymagań i celów czasu uruchamiania ściśle, wpisy rejestru lub prostego pliku INI może być szybsze zamiast uruchamiania.For example, if an application has simple configuration requirements and has strict startup time goals, registry entries or a simple INI file may be a faster startup alternative.

Korzystanie z pamięci podręcznej GACUtilize the GAC

Zestaw nie jest zainstalowany w globalnej pamięci podręcznej zestawów (GAC), czy opóźnienia spowodowane tym, że weryfikacja skrótu zestawów o silnych nazwach i sprawdzania poprawności obrazów Ngen obraz natywny dla tego zestawu znajduje się na komputerze.If an assembly is not installed in the Global Assembly Cache (GAC), there are delays caused by hash verification of strong-named assemblies and by Ngen image validation if a native image for that assembly is available on the computer. Weryfikacja silnej nazwy jest pomijana dla wszystkich zestawów zainstalowane w GAC.Strong-name verification is skipped for all assemblies installed in the GAC. Aby uzyskać więcej informacji, zobacz Gacutil.exe (Global Assembly Cache Tool).For more information, see Gacutil.exe (Global Assembly Cache Tool).

Użyj Ngen.exeUse Ngen.exe

Należy rozważyć użycie Native Image Generator (Ngen.exe) w swojej aplikacji.Consider using the Native Image Generator (Ngen.exe) on your application. Użycie Ngen.exe oznacza, handlem użycia procesora CPU, więcej dostępu do dysku, ponieważ może być większe od obrazu MSIL obrazu natywnego wygenerowanego przez Ngen.exe.Using Ngen.exe means trading CPU consumption for more disk access because the native image generated by Ngen.exe is likely to be larger than the MSIL image.

Aby poprawić czas uruchamiania bez wyłączania zasilania, należy zawsze używać Ngen.exe w swojej aplikacji, ponieważ pozwala to uniknąć użycia Procesora CPU kompilacji JIT kodu aplikacji.To improve the warm startup time, you should always use Ngen.exe on your application, because this avoids the CPU cost of JIT compilation of the application code.

W niektórych scenariuszach podczas zimnego uruchamiania przy użyciu Ngen.exe może być również przydatne.In some cold startup scenarios, using Ngen.exe can also be helpful. Jest to spowodowane kompilator JIT (mscorjit.dll) nie będzie musiał zostać załadowany.This is because the JIT compiler (mscorjit.dll) does not have to be loaded.

Moduły Ngen i JIT może mieć wpływ najgorszy.Having both Ngen and JIT modules can have the worst effect. Jest to spowodowane mscorjit.dll muszą zostać załadowane, a gdy kompilator JIT pracuje nad kodem, liczbę stron w obrazów Ngen muszą być dostępne, gdy kompilator JIT czyta metadane zestawów.This is because mscorjit.dll must be loaded, and when the JIT compiler works on your code, many pages in the Ngen images must be accessed when the JIT compiler reads the assemblies' metadata.

Ngen i technologii ClickOnceNgen and ClickOnce

Sposób, którą chcesz wdrożyć aplikację można również ustawić różnica w czasie ładowania.The way you plan to deploy your application can also make a difference in load time. Wdrażanie aplikacji ClickOnce nie obsługuje polecenia Ngen.ClickOnce application deployment does not support Ngen. Jeśli zdecydujesz się użyć Ngen.exe dla aplikacji, należy użyć innego mechanizmu wdrażania, takich jak Instalator Windows.If you decide to use Ngen.exe for your application, you will have to use another deployment mechanism, such as Windows Installer.

Aby uzyskać więcej informacji, zobacz Ngen.exe (Generator obrazu natywnego).For more information, see Ngen.exe (Native Image Generator).

Rebasing i konflikty adresów biblioteki DLLRebasing and DLL Address Collisions

Użycie Ngen.exe, należy pamiętać, że zmienianie bazy może wystąpić, gdy obrazy natywne są ładowane do pamięci.If you use Ngen.exe, be aware that rebasing can occur when the native images are loaded in memory. Jeśli biblioteka DLL nie jest ładowany w swoim preferowanym adresem bazowym, ponieważ ten zakres adresów jest już przydzielony, moduł ładujący Windows załaduje go na inny adres, który może być czasochłonna operacja.If a DLL is not loaded at its preferred base address because that address range is already allocated, the Windows loader will load it at another address, which can be a time-consuming operation.

Aby sprawdzić, czy istnieją moduły, w których wszystkie strony są prywatne, można użyć narzędzia wirtualnego adresu zrzutu (Vadump.exe).You can use the Virtual Address Dump (Vadump.exe) tool to check if there are modules in which all the pages are private. Jeśli jest to możliwe, moduł może została zmieniona na inny adres.If this is the case, the module may have been rebased to a different address. W związku z tym nie można współużytkować jego stron.Therefore, its pages cannot be shared.

Aby uzyskać więcej informacji o tym, jak ustawić adres podstawowy, zobacz Ngen.exe (Generator obrazu natywnego).For more information about how to set the base address, see Ngen.exe (Native Image Generator).

Optymalizowanie AuthenticodeOptimize Authenticode

Weryfikacja Authenticode dodaje do czasu uruchamiania.Authenticode verification adds to the startup time. Zestawy z podpisem Authenticode trzeba można sprawdzić przy użyciu urzędu certyfikacji (CA).Authenticode-signed assemblies have to be verified with the certification authority (CA). Ta weryfikacja może być czasochłonne, ponieważ może wymagać, nawiązywanie połączenia z siecią kilka razy pobieranie bieżącej listy odwołania certyfikatów.This verification can be time consuming, because it can require connecting to the network several times to download current certificate revocation lists. Zapewnia się także pewność, że pełny łańcuch prawidłowe certyfikaty na ścieżce zaufany główny urząd certyfikacji.It also makes sure that there is a full chain of valid certificates on the path to a trusted root. To może dokonywać translacji na kilka sekund opóźnienia podczas ładowania zestawu.This can translate to several seconds of delay while the assembly is being loaded.

Należy rozważyć zainstalowanie certyfikatu urzędu certyfikacji na komputerze klienckim lub Unikaj używania Authenticode, gdy jest to możliwe.Consider installing the CA certificate on the client computer, or avoid using Authenticode when it is possible. Jeśli wiesz, aplikacja nie wymaga dowód wydawcy, nie trzeba naliczana jest opłata za weryfikacji podpisu.If you know that your application does not need the publisher evidence, you do not have to pay the cost of signature verification.

Począwszy od programu .NET Framework 3.5, ma opcji konfiguracji, która umożliwia weryfikacji Authenticode do obejścia.Starting in .NET Framework 3.5, there is a configuration option that allows the Authenticode verification to be bypassed. Aby to zrobić, Dodaj następujące ustawienie do pliku app.exe.config:To do this, add the following setting to the app.exe.config file:

<configuration>  
    <runtime>  
        <generatePublisherEvidence enabled="false"/>   
    </runtime>  
</configuration>  

Aby uzyskać więcej informacji, zobacz <generatePublisherEvidence > Element.For more information, see <generatePublisherEvidence> Element.

Porównanie wydajności w systemie Windows VistaCompare Performance on Windows Vista

Menedżer pamięci w Windows Vista ma technologia o nazwie wstępne ładowanie do pamięci.The memory manager in Windows Vista has a technology called SuperFetch. Wstępne ładowanie do pamięci analizuje wzorce użycia pamięci wraz z upływem czasu, aby określić zawartość pamięci optymalne dla określonego użytkownika.SuperFetch analyzes memory usage patterns over time to determine the optimal memory content for a specific user. Działa ona nieprzerwanie do obsługi tej zawartości przez cały czas.It works continuously to maintain that content at all times.

To podejście różni się od pobierania wstępnego zastosowanych w Windows XP wstępnie ładuje dane do pamięci bez analizowanie wzorców użycia.This approach differs from the pre-fetch technique used in Windows XP, which preloads data into memory without analyzing usage patterns. Wraz z upływem czasu Jeśli użytkownik używa aplikacji środowiska WPF często w Windows Vista, zwiększyć czas podczas zimnego uruchamiania aplikacji.Over time, if the user uses your WPF application frequently on Windows Vista, the cold startup time of your application may improve.

Efektywnie wykorzystać domen aplikacjiUse AppDomains Efficiently

Jeśli to możliwe ładowanie zestawów do obszaru kodu neutralnego względem domeny, aby upewnić się, że obrazu natywnego, jeśli istnieje, jest stosowana w wszystkich domen aplikacji utworzonych w aplikacji.If possible, load assemblies into a domain-neutral code area to make sure that the native image, if one exists, is used in all AppDomains created in the application.

Aby uzyskać najlepszą wydajność wymusić sprawną komunikację między domenami, zmniejszając wywołania między domenami.For the best performance, enforce efficient cross-domain communication by reducing cross-domain calls. Jeśli to możliwe, należy użyć wywołania bez argumentów lub z argumentami typu pierwotnego.When possible, use calls without arguments or with primitive type arguments.

Użyj atrybutu NeutralResourcesLanguageUse the NeutralResourcesLanguage Attribute

Użyj NeutralResourcesLanguageAttribute do określenia kultury neutralnej dla ResourceManager.Use the NeutralResourcesLanguageAttribute to specify the neutral culture for the ResourceManager. W tym podejściu unika zestawu niepomyślnych wyszukiwań.This approach avoids unsuccessful assembly lookups.

Korzystanie z klasy elementu do serializacjiUse the BinaryFormatter Class for Serialization

Jeśli musisz użyć serializacji, należy użyć BinaryFormatter klasy zamiast XmlSerializer klasy.If you must use serialization, use the BinaryFormatter class instead of the XmlSerializer class. BinaryFormatter Klasy jest zaimplementowana w Biblioteka klasy podstawowej (BCL) w zestawie biblioteki mscorlib.dll.The BinaryFormatter class is implemented in the Base Class Library (BCL) in the mscorlib.dll assembly. XmlSerializer Jest zaimplementowana w zestawie System.Xml.dll, która może być dodatkowe biblioteki DLL do załadowania.The XmlSerializer is implemented in the System.Xml.dll assembly, which might be an additional DLL to load.

Jeśli musisz użyć XmlSerializer klasy, można osiągnąć lepszą wydajność w przypadku wstępnie wygenerować zestawu serializacji.If you must use the XmlSerializer class, you can achieve better performance if you pre-generate the serialization assembly.

Konfigurowanie ClickOnce, aby sprawdzić aktualizacje po uruchomieniuConfigure ClickOnce to Check for Updates After Startup

Jeśli aplikacja korzysta z technologii ClickOnce, należy unikać dostępu do sieci podczas uruchamiania, konfigurując ClickOnce, aby sprawdzić lokacji wdrożenia aktualizacji po uruchomieniu aplikacji.If your application uses ClickOnce, avoid network access on startup by configuring ClickOnce to check the deployment site for updates after the application starts.

Jeśli używasz modelu (XBAP) aplikacji przeglądarki XAML, należy pamiętać o tym, ClickOnce sprawdza lokacji wdrożenia aktualizacji, nawet jeśli XBAP jest już w pamięci podręcznej funkcji ClickOnce.If you use the XAML browser application (XBAP) model, keep in mind that ClickOnce checks the deployment site for updates even if the XBAP is already in the ClickOnce cache. Aby uzyskać więcej informacji, zobacz wdrażania i zabezpieczeń ClickOnce.For more information, see ClickOnce Security and Deployment.

Automatycznie skonfigurować usługę PresentationFontCache do ekranu startowegoConfigure the PresentationFontCache Service to Start Automatically

Do uruchomienia po ponownym uruchomieniu pierwszej aplikacji WPF to usługa PresentationFontCache.The first WPF application to run after a reboot is the PresentationFontCache service. Usługa przechowuje czcionki systemowe, zwiększa czcionki dostęp i zwiększa ogólną wydajność.The service caches the system fonts, improves font access, and improves overall performance. Występuje obciążenie podczas uruchamiania usługi, a w niektórych środowiskach kontrolowanego, rozważ skonfigurowanie usługi do automatycznego uruchamiania, po ponownym rozruchu systemu.There is an overhead in starting the service, and in some controlled environments, consider configuring the service to start automatically when the system reboots.

Ustaw programowo powiązania danychSet Data Binding Programmatically

Zamiast przy użyciu XAML, aby ustawić DataContext deklaratywnie w głównym oknie, warto ustawić programowo w OnActivated metody.Instead of using XAML to set the DataContext declaratively for the main window, consider setting it programmatically in the OnActivated method.

Zobacz takżeSee also