Измерение улучшения запуска с машинным кодом .NETMeasuring Startup Improvement with .NET Native

.NET Native.NET Native значительно сокращает время запуска приложений.significantly improves the launch time of apps. Это улучшение особенно заметно на портативных устройствах малой мощности, а также при сложных приложениях.This improvement is particularly noticeable on portable, low-powered devices and with complex apps. Этот раздел поможет вам приступить к работе с основным инструментарием, который необходим для измерения данного улучшения запуска.This topic helps you get started with the basic instrumentation needed to measure this startup improvement.

Для облегчения анализа производительности, платформа.NET Framework и Windows используют платформу трассировки событий для Windows (ETW), которая позволяет приложениям уведомлять средства для работы при возникновении событий.To facilitate performance investigations, the .NET Framework and Windows use an event framework called Event Tracing for Windows (ETW) that allows your app to notify tooling when events happen. Затем можно использовать инструмент PerfView для просмотра и анализа событий ЕТW.You can then use a tool called PerfView to easily view and analyze of ETW events. В этом разделе объясняется, как:This topic explains how to:

  • Использовать класс EventSource для порождения событий.Use the EventSource class to emit events.

  • Использовать PerfView для сбора событий.Use PerfView to gather those events.

  • Использовать PerfView для отображения событий.Use PerfView to display those events.

Использование EventSource для порождения событийUsing EventSource to emit events

EventSource Предоставляет базовый класс для создания пользовательского поставщика событий.provides a base class from which to create a custom event provider. Как правило, создается подкласс EventSource и методы Write* помещаются в оболочку с вашими собственными методами событий.Generally, you create a subclass of EventSource and wrap the Write* methods with your own event methods. Обычно используется единый шаблон для каждого EventSource.A singleton pattern is generally used for each EventSource.

Например, в следующем примере класс может использоваться для измерения двух характеристик производительности:For example, the class in the following example can be used to measure two performance characteristics:

  • времени до вызова конструктора класса App.The time until the App class constructor was called.

  • времени до вызова конструктора класса MainPage.The time until the MainPage constructor was called.

using System;
using System.Diagnostics.Tracing;

[EventSource(Name="MyCompany-MyApp")]
public sealed class AppEventSource : EventSource
{
   public static AppEventSource Log = new AppEventSource ();

  // The numbers passed to WriteEvent and EventAttribute
  // must increment with each logging method.  
  [Event(1)]
  public void AppInitialized() { WriteEvent(1, ""); }
  
  [Event(2)]
  public void MainPageInitialized() { WriteEvent(2, ""); }
}

Здесь необходимо обратить внимание на несколько моментов.There are a few things to notice here. Во-первых, создается единственный элемент в AppEventSource.Log.First, a singleton is created in AppEventSource.Log. Этот экземпляр будет использоваться для ведения журналов.That instance will be used for all logging. Во-вторых, каждый метод событий имеет EventAttribute.Second, each event method has an EventAttribute. Это позволяет средствам для работы связать индекс метода WriteEvent с методом, который был вызван на AppEventSource.This helps tooling associate the index of the WriteEvent method with the method that was called on AppEventSource.

Обратите внимание, что эти события являются чисто иллюстративными.Note that these events are purely illustrative. Большая часть кода приложения будет выполняться после этих событий.Most app code will run after these events. Следует понимать, какие события в коде соответствуют взаимодействию с пользователем, измерять их и улучшить их показатели.You should understand which events in code correspond to user interactions, measure those, and improve those benchmarks. Кроме того, сами события заносят в журнал только один экземпляр за все время.Also, the events themselves log only a single instance in time. Часто бывает полезно иметь пару начала и окончания событий для каждой операции.It’s often useful to have paired start and stop events for every operation. При проверке запуска приложения в качестве события запуска, как правило, используется событие "Process/Start" (Запуск процесса), которое порождает операционная система.When examining app startup, the start event is generally the "Process/Start" event that the operating system emits.

Например, предположим, что создается программа чтения RSS-каналов.For example, suppose you are creating an RSS reader. Несколько интересных мест для занесения событий в журнал:A few interesting locations to log an event are:

  • При первом отображении главной страницы.When the main page is first rendered.

  • При десериализации старой истории RSS из локального хранилища.When old RSS stories are deserialized from local storage.

  • Когда приложение начинает синхронизацию новых историй.When your app begins syncing new stories.

  • Когда приложение завершило синхронизацию новых историй.When your app has finished syncing new stories.

Инструментировать приложения очень просто: Просто вызовите соответствующий метод в производном классе.Instrumenting an app is straightforward: Just call the appropriate method on the derived class. С помощью AppEventSource из предыдущего примера можно инструментировать приложение следующим образом:Using AppEventSource from the previous example, you can instrument an app as follows:

using System;
using Windows.ApplicationModel;
using Windows.UI.Xaml; 

public sealed partial class App
{
    public App()
    {
        this.InitializeComponent();
        this.Suspending += OnSuspending;
        AppEventSource.Log.AppInitialized();
    }
} 
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        AppEventSource.Log.MainPageInitialized();
    }
}

После инструментирования приложения можно приступить к сбору событий.When the app is instrumented, you’re ready to gather events.

Сбор событий с PerfViewGathering events with PerfView

PerfView использует события ЕТW для облегчения выполнения всех видов анализа производительности приложения.PerfView uses ETW events to help you do all sorts of performance investigations on your app. Это средство также содержит графический интерфейс настройки, который позволяет включать и выключать ведение журнала для различных типов событий.It also includes a configuration GUI that lets you turn logging for different types of events on or off. Средство PerfView предоставляется бесплатно. Его можно скачать из Центра загрузки Майкрософт.PerfView is a free tool and can be downloaded from the Microsoft Download Center. Дополнительные сведения см. в обучающих видеороликах по PerfView.For more information, watch the PerfView tutorial videos.

Примечание

PerfView не может использоваться для сбора событий в системах ARM.PerfView cannot be used to collect events on ARM systems. Для сбора событий в системах ARM, используйте средство записи производительности Windows (WPR).To collect events on ARM systems, use Windows Performance Recorder (WPR). Дополнительные сведения см. в записи в блоге Вэнса Моррисона.For more information, see Vance Morrison's blog post.

PerfView также можно вызвать из командной строки.You can also invoke PerfView from the command line. Чтобы занести в журнал только события своего поставщика, откройте окно командной строки и введите команду:To log only the events from your provider, open the Command Prompt window and enter the command:

perfview -KernelEvents:Process -OnlyProviders:*MyCompany-MyApp collect outputFile   

Здесь:where:

-KernelEvents:Process
Указывает, что вам необходимо знать, когда процесс запускается и останавливается.Indicates that you want to know when the process starts and stops. Для приложения необходимо событие Process/Start, чтобы оно могло быть вычтено из времени других событий.You need the Process/Start event for your app so it can be subtracted from other event times.

-OnlyProviders:*MyCompany-MyApp
Отключает других поставщиков, которые PerfView включает по умолчанию и включает поставщика MyCompany MyApp.Turns off other providers that PerfView turns on by default, and turns on the MyCompany-MyApp provider. (Звездочка означает, что это EventSource.)(The asterisk indicates that it is an EventSource.)

collect outputFile
Указывает, что необходимо начать сбор и сохранение данных outputFile.etl.zip.Indicates that you want to start collection and save the data to outputFile.etl.zip.

Выполнение приложения после запуска PerfView.Run your app after starting PerfView. Есть несколько моментов, которые необходимо помнить при запуске приложения.There are a few things to remember when running your app:

  • Используйте построение выпуска, а не отладочное построение.Use a release build, not a debug build. Отладочные построения часто содержат проверку дополнительных ошибок и ошибок обработки кода, в результате чего приложение будет работать медленнее, чем ожидалось.Debug builds often contain extra error checking and error handling code that can cause your app to run slower than expected.

  • Выполнение приложений с подключенным отладчиком влияет на его производительность.Running your app with a debugger attached affects the performance of your app.

  • Windows использует несколько стратегий кэширования, чтобы ускорить время запуска приложения.Windows uses multiple caching strategies to speed up app launch times. Если ваше приложение кэшировано в памяти и его не нужно загружать с диска, оно запускается быстрее.If your app is currently cached in memory and doesn't have to be loaded from disk, it will start faster. Для обеспечения согласованности, запустите и закройте приложение несколько раз перед его измерением.To ensure consistency, start and close your app a few times before measuring it.

После запуска приложения и завершения сбора данных о событиях в PerfView нажмите кнопку Остановить сбор.When you’ve run your app so that PerfView can collect emitted events, choose the Stop Collection button. Как правило, следует остановить сбор перед закрытием приложения, чтобы не получить посторонних событий.Generally, you should stop collection before closing your app so you don’t get extraneous events. Тем не менее, если измеряется быстродействия завершения работы или приостановки, будет необходимо продолжить сбор.However, if you’re measuring shutdown or suspension performance, you’ll want to continue collection.

Отображение событийDisplaying the events

Чтобы просмотреть уже собранные события, откройте созданный файл .etl или. etl.zip в PerfView и нажмите кнопку События.To view the events that have already been collected, use PerfView to open the .etl or .etl.zip file you created and choose Events. К этому моменту ETW уже соберет информацию о большом количестве событий, в том числе о событиях из других процессов.ETW will have collected information about a large number of events, including events from other processes. Чтобы сузить ваш анализ на определенных измерениях, заполните следующие текстовые поля в представлении событий:To focus your investigation, complete the following text boxes in the events view:

  • В поле Фильтр процесса укажите имя приложения (без ".exe").In the Process Filter box, specify your app name (without ".exe").

  • В поле Фильтр типов событий укажите Process/Start | MyCompany-MyApp.In the Event Types Filter box, specify Process/Start | MyCompany-MyApp. Это задает фильтр событий из MyCompany MyApp и события Windows Kernel/Process/Start (Ядро/процесс/запуск). This sets a filter for events from MyCompany-MyApp and the Windows Kernel/Process/Start event.

Выберите все события, указанные в области слева (CTRL+A), и нажмите клавишу ВВОД.Select all the events listed in the left pane (Ctrl-A) and choose the Enter key. Теперь можно будет видеть метки времени каждого события.Now, you should be able to see the timestamps from each event. Эти метки времени измеряются относительно начала трассировки, поэтому следует вычесть время каждого события из времени запуска процесса, чтобы определить время, прошедшее с момента запуска.These timestamps are relative to the start of the trace, so you have to subtract the time of each event from the start time of the process to identify the elapsed time since startup. При использовании Ctrl + щелчок для выбора двух меток времени, вы увидите, что разница между ними отображается в строке состояния в нижней части страницы.If you use Ctrl+Click to select two timestamps, you'll see the difference between them displayed in the status bar at the bottom of the page. Это позволяет легко увидеть время, прошедшее между любыми двумя событиями, на экране (включая запуск процесса).This makes it easy to see the elapsed time between any two events in the display (including process start). Можно открыть контекстное меню представления и выбрать различные полезные параметры, например, экспорт в файлы CSV или открытие Microsoft Excel для сохранения или обработки данных.You can open the shortcut menu for the view and select from a number of useful options, like exporting to CSV files or opening Microsoft Excel to save or process the data.

Повторяя процедуры для исходного приложения и версии, построенных с использованием цепочки инструментов .NET Native.NET Native, можно сравнить разницу в производительности.By repeating the procedure for both your original app and the version you built by using the .NET Native.NET Native tool chain, you can compare the difference in performance. .NET Native.NET Native приложения обычно запускаются быстрее, чем отличных.NET Native.NET Native приложений.apps generally start faster than non-.NET Native.NET Native apps. Если вы заинтересованы в более глубокой информации, то PerfView также может определить части кода, на выполнение которых уходит больше всего времени.If you’re interested in digging deeper, PerfView can also identify the parts of your code that are taking the most time. Дополнительные сведения см. в руководствах по PerfView или в записи в блоге Вэнса Моррисона.For more information, watch the PerfView tutorials or read Vance Morrison’s blog entry.

См. такжеSee also