Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
.NET Native mejora significativamente el tiempo de inicio de las aplicaciones. Esta mejora es especialmente notable en dispositivos portátiles y con aplicaciones complejas. Este tema le ayuda a comenzar con la instrumentación básica necesaria para medir esta mejora inicial.
Para facilitar las investigaciones de rendimiento, .NET Framework y Windows usan un marco de eventos denominado Seguimiento de eventos para Windows (ETW) que permite a la aplicación notificar herramientas cuando se producen eventos. A continuación, puede usar una herramienta denominada PerfView para ver y analizar fácilmente los eventos ETW. En este tema se explica cómo:
Use la EventSource clase para emitir eventos.
Use PerfView para recopilar esos eventos.
Use PerfView para mostrar esos eventos.
Uso de EventSource para emitir eventos
EventSource proporciona una clase base desde la que se va a crear un proveedor de eventos personalizado. Por lo general, se crea una subclase de EventSource y se encapsulan los métodos de Write*
con sus propios métodos de evento. Normalmente se usa un patrón singleton para cada EventSource.
Por ejemplo, la clase del ejemplo siguiente se puede usar para medir dos características de rendimiento:
Tiempo hasta que se llamó al constructor de clase
App
.Tiempo transcurrido hasta que se llamó al constructor de
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, ""); }
}
Hay algunas cosas que observar aquí. En primer lugar, se crea un singleton en AppEventSource.Log
. Esa instancia se usará para todo el registro. En segundo lugar, cada método de evento tiene un EventAttribute. Esto ayuda a las herramientas a asociar el índice del método WriteEvent con el método que se llamó en AppEventSource
.
Tenga en cuenta que estos eventos son meramente ilustrativos. La mayoría del código de la aplicación se ejecutará después de estos eventos. Debe comprender qué eventos del código corresponden a las interacciones del usuario, medirlas y mejorar esas pruebas comparativas. Además, los propios eventos registran solo una instancia en el tiempo. A menudo resulta útil tener eventos de inicio y detención emparejados para cada operación. Al examinar el inicio de la aplicación, el evento start suele ser el evento "Process/Start" que emite el sistema operativo.
Por ejemplo, supongamos que va a crear un lector RSS. Algunas ubicaciones interesantes para registrar un evento son:
Cuando la página principal se carga por primera vez.
Cuando se deserializan historias RSS antiguas del almacenamiento local.
Cuando tu aplicación comienza a sincronizar nuevas historias.
Cuando la aplicación haya terminado de sincronizar nuevas historias.
La instrumentación de una aplicación es sencilla: simplemente llame al método adecuado en la clase derivada. Con AppEventSource
el ejemplo anterior, puede instrumentar una aplicación de la siguiente manera:
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();
}
}
Cuando se instrumenta la aplicación, estás listo para recopilar eventos.
Recopilación de eventos con PerfView
PerfView usa eventos ETW para ayudarle a realizar todo tipo de investigaciones de rendimiento en la aplicación. También incluye una GUI de configuración que permite activar o desactivar el registro de diferentes tipos de eventos. PerfView es una herramienta de código abierto. Para obtener más información, vea los vídeos del tutorial de PerfView.
Nota:
PerfView no se puede usar para recopilar eventos en sistemas Arm. Para recopilar eventos en sistemas Arm, use Windows Performance Recorder (WPR). Para obtener más información, consulte la entrada de blog de Vance Morrison.
También puede invocar PerfView desde la línea de comandos. Para registrar solo los eventos de su proveedor, abra la ventana del Símbolo del sistema y escriba el comando:
perfview -KernelEvents:Process -OnlyProviders:*MyCompany-MyApp collect outputFile
donde:
-KernelEvents:Process
Indica que desea saber cuándo se inicia y se detiene el proceso. Necesita el evento Process/Start para su aplicación, para que se pueda restar de los tiempos de otros eventos.
-OnlyProviders:*MyCompany-MyApp
Desactiva otros proveedores que PerfView activa de forma predeterminada y activa el proveedor de MyCompany-MyApp. (El asterisco indica que es un EventSource.)
collect outputFile
Indica que desea iniciar la recopilación y guardar los datos en outputFile.etl.zip.
Ejecute la aplicación después de iniciar PerfView. Hay algunas cosas que recordar al ejecutar la aplicación:
Use una compilación de versión, no una compilación de depuración. Las compilaciones de depuración suelen contener código adicional de comprobación de errores y control de errores que puede hacer que la aplicación se ejecute más lenta de lo esperado.
La ejecución de la aplicación con un depurador asociado afecta al rendimiento de la aplicación.
Windows usa varias estrategias de almacenamiento en caché para acelerar los tiempos de inicio de la aplicación. Si la aplicación se almacena actualmente en caché en memoria y no tiene que cargarse desde el disco, se iniciará más rápido. Para garantizar la coherencia, inicie y cierre la aplicación varias veces antes de medirla.
Cuando haya ejecutado la aplicación para que PerfView pueda recopilar eventos emitidos, elija el botón Detener recopilación. Por lo general, debes detener la recopilación antes de cerrar la aplicación para que no obtengas eventos extraños. Sin embargo, si está midiendo el rendimiento de apagado o suspensión, querrá seguir recopilando datos.
Mostrar los eventos
Para ver los eventos que ya se han recopilado, use PerfView para abrir el archivo .etl o .etl.zip que creó y elija Eventos. ETW habrá recopilado información sobre un gran número de eventos, incluidos los eventos de otros procesos. Para centrar la investigación, complete los siguientes cuadros de texto en la vista de eventos:
En el cuadro filtro de proceso de [], especifique su nombre de aplicación (sin ".exe").
En el cuadro filtro de Tipos de Eventos , especifique
Process/Start | MyCompany-MyApp
. Esto establece un filtro para eventos de MyCompany-MyApp y el evento Kernel/Process/Start de Windows.
Seleccione todos los eventos enumerados en el panel izquierdo (Ctrl-A) y elija la clave Entrar. Ahora, debería poder ver las marcas de tiempo de cada evento. Estas marcas de tiempo son relativas al inicio del seguimiento, por lo que debe restar la hora de cada evento de la hora de inicio del proceso para identificar el tiempo transcurrido desde el inicio. Si usa Ctrl+Clic para seleccionar dos marcas de tiempo, verá la diferencia entre ellas en la barra de estado de la parte inferior de la página. Esto facilita la visualización del tiempo transcurrido entre dos eventos en la pantalla (incluido el inicio del proceso). Puede abrir el menú contextual de la vista y seleccionar entre varias opciones útiles, como exportar a archivos CSV o abrir Microsoft Excel para guardar o procesar los datos.
Al repetir el procedimiento para la aplicación original y la versión que creó mediante la cadena de herramientas de .NET Native, puede comparar la diferencia en el rendimiento. Las aplicaciones .NET Native suelen iniciarse más rápido que non-.NET aplicaciones nativas. Si está interesado en profundizar más, PerfView también puede identificar las partes del código que tardan más tiempo. Para obtener más información, vea los tutoriales de PerfView, o lea la entrada de blog de Vance Morrison .