Измерение улучшения запуска с помощью .NET Native

.NET Native значительно улучшает время запуска приложений. Это улучшение особенно заметно на портативных устройствах малой мощности, а также при сложных приложениях. Этот раздел поможет вам приступить к работе с основным инструментарием, который необходим для измерения данного улучшения запуска.

Чтобы упростить исследования производительности, платформа .NET Framework и Windows используют платформу событий с именем Трассировка событий для Windows (ETW), которая позволяет приложению уведомлять средства при возникновении событий. Затем можно использовать инструмент PerfView для просмотра и анализа событий ЕТW. В этом разделе объясняется, как:

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

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

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

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

EventSourceпредоставляет базовый класс для создания настраиваемого поставщика событий. Как правило, создается подкласс EventSource и методы Write* помещаются в оболочку с вашими собственными методами событий. Обычно используется единый шаблон для каждого EventSource.

Например, в следующем примере класс может использоваться для измерения двух характеристик производительности:

  • времени до вызова конструктора класса App.

  • времени до вызова конструктора класса MainPage.

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, ""); }
}

Здесь необходимо обратить внимание на несколько моментов. Во-первых, создается единственный элемент в AppEventSource.Log. Этот экземпляр будет использоваться для ведения журналов. Во-вторых, каждый метод событий имеет EventAttribute. Это позволяет средствам для работы связать индекс метода WriteEvent с методом, который был вызван на AppEventSource.

Обратите внимание, что эти события являются чисто иллюстративными. Большая часть кода приложения будет выполняться после этих событий. Следует понимать, какие события в коде соответствуют взаимодействию с пользователем, измерять их и улучшить их показатели. Кроме того, сами события заносят в журнал только один экземпляр за все время. Часто полезно иметь связанные события запуска и остановки для каждой операции. При проверке запуска приложения в качестве события запуска, как правило, используется событие "Process/Start" (Запуск процесса), которое порождает операционная система.

Например, предположим, что создается программа чтения RSS-каналов. Несколько интересных мест для занесения событий в журнал:

  • При первом отображении главной страницы.

  • При десериализации старой истории RSS из локального хранилища.

  • Когда приложение начинает синхронизацию новых историй.

  • Когда приложение завершило синхронизацию новых историй.

Инструментировать приложения очень просто: достаточно вызвать соответствующий метод в производном классе. С помощью AppEventSource из предыдущего примера можно инструментировать приложение следующим образом:

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();
    }
}

Когда приложение инструментировано, вы готовы собирать события.

Сбор событий с PerfView

PerfView использует события ЕТW для облегчения выполнения всех видов анализа производительности приложения. Это средство также содержит графический интерфейс настройки, который позволяет включать и выключать ведение журнала для различных типов событий. PerfView — это средство с открытым кодом. Дополнительные сведения см. в обучающих видеороликах по PerfView.

Примечание.

PerfView нельзя использовать для сбора событий в системах Arm. Чтобы собирать события в системах Arm, используйте средство записи производительности Windows (WPR). Дополнительные сведения см. в записи в блоге Вэнса Моррисона.

PerfView также можно вызвать из командной строки. Чтобы занести в журнал только события своего поставщика, откройте окно командной строки и введите команду:

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

где:

-KernelEvents:Process

Указывает, что вам необходимо знать, когда процесс запускается и останавливается. Для приложения необходимо событие Process/Start, чтобы оно могло быть вычтено из времени других событий.

-OnlyProviders:*MyCompany-MyApp

Отключает других поставщиков, которые PerfView включает по умолчанию и включает поставщика MyCompany MyApp. (Звездочка означает, что это EventSource.)

collect outputFile

Указывает, что необходимо начать сбор и сохранение данных outputFile.etl.zip.

Выполнение приложения после запуска PerfView. Есть несколько моментов, которые необходимо помнить при запуске приложения.

  • Используйте построение выпуска, а не отладочное построение. Отладочные построения часто содержат проверку дополнительных ошибок и ошибок обработки кода, в результате чего приложение будет работать медленнее, чем ожидалось.

  • Выполнение приложений с подключенным отладчиком влияет на его производительность.

  • Windows использует несколько стратегий кэширования, чтобы ускорить время запуска приложения. Если ваше приложение кэшировано в памяти и его не нужно загружать с диска, оно запускается быстрее. Для обеспечения согласованности, запустите и закройте приложение несколько раз перед его измерением.

При запуске приложения, чтобы PerfView могли собирать созданные события, нажмите кнопку "Остановить коллекцию ". Как правило, перед закрытием приложения следует остановить сбор, чтобы не получать лишние события. Однако если вы измеряете производительность завершения работы или приостановки, вы захотите продолжить сбор.

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

Чтобы просмотреть уже собранные события, откройте созданный файл .etl или. etl.zip в PerfView и нажмите кнопку События. К этому моменту ETW уже соберет информацию о большом количестве событий, в том числе о событиях из других процессов. Чтобы сузить ваш анализ на определенных измерениях, заполните следующие текстовые поля в представлении событий:

  • В поле Фильтр процесса укажите имя приложения (без ".exe").

  • В поле Фильтр типов событий укажите Process/Start | MyCompany-MyApp. Это задает фильтр событий из MyCompany MyApp и события Windows Kernel/Process/Start (Ядро/процесс/запуск).

Выберите все события, указанные в области слева (CTRL+A), и нажмите клавишу ВВОД. Теперь можно будет видеть метки времени каждого события. Эти метки времени измеряются относительно начала трассировки, поэтому следует вычесть время каждого события из времени запуска процесса, чтобы определить время, прошедшее с момента запуска. При использовании Ctrl + щелчок для выбора двух меток времени, вы увидите, что разница между ними отображается в строке состояния в нижней части страницы. Это позволяет легко увидеть время, прошедшее между любыми двумя событиями, на экране (включая запуск процесса). Можно открыть контекстное меню представления и выбрать различные полезные параметры, например, экспорт в файлы CSV или открытие Microsoft Excel для сохранения или обработки данных.

Повторяя процедуру для исходного приложения и версии, созданной с помощью цепочки инструментов .NET Native, можно сравнить разницу в производительности. Приложения .NET Native обычно запускают быстрее, чем non-.NET собственные приложения. Если вы заинтересованы в более глубоком анализе, PerfView также может определить части кода, которые занимают больше всего времени. Дополнительные сведения см. в руководствах По PerfView или на чтение записи блога Vance Morrison.

См. также