Medir el impacto de la extensión de inicioMeasuring extension impact in startup

Centrarse en el rendimiento de la extensión en Visual Studio 2017Focus on extension performance in Visual Studio 2017

Según los comentarios recibidos, una de las áreas de enfoque para Visual Studio 2017 versión ha sido rendimiento de carga de inicio y la solución.Based on customer feedback, one of the focus areas for Visual Studio 2017 release has been startup and solution load performance. Como el equipo de plataforma de Visual Studio, hemos estado trabajando en mejorar el rendimiento de carga de inicio y la solución.As the Visual Studio platform team, we have been working on improving startup and solution load performance. En general, nuestras mediciones sugieren las extensiones instaladas también pueden tener una repercusión importante en estos escenarios.In general, our measurements suggest installed extensions can also have a considerable impact on those scenarios.

Para ayudar a los usuarios a comprender mejor este efecto, hemos agregado una característica nueva en Visual Studio para notificar a los usuarios de las extensiones de baja velocidad.To help users understand this impact, we added a new feature in Visual Studio to notify users of slow extensions. A veces, Visual Studio detecta una nueva extensión que se ralentiza la carga de solución o de inicio.Sometimes, Visual Studio detects a new extension that slows down either solution load or startup. Cuando se detecta una ralentización, los usuarios verán una notificación en el IDE que les dirija al nuevo cuadro de diálogo "Administrar el rendimiento de Visual Studio".When a slowdown is detected, users will see a notification in the IDE pointing them to new "Manage Visual Studio Performance" dialog. Este cuadro de diálogo también siempre se puede acceder al menú Ayuda para buscar extensiones detectadas previamente.This dialog can also always be accessed by Help menu to browse previously detected extensions.

administrar el rendimiento de Visual Studio

El objetivo de este documento es ayudar a los desarrolladores de extensiones con la descripción de cómo se calcula el impacto de la extensión.This document aims to help extension developers by describing how extension impact is calculated. Este documento también describe cómo se puede analizar el impacto de extensión localmente.This document also describes how extension impact can be analyzed locally. Localmente análisis del impacto de la extensión determinará si una extensión se muestren como un rendimiento que afectan a la extensión.Locally analyzing extension impact will determine if an extension may be shown as a performance impacting extension.

Nota

Este documento se centra en el impacto de las extensiones de carga de inicio y la solución.This document focuses on the impact of extensions on startup and solution load. Las extensiones también afectan el rendimiento de Visual Studio cuando hacen que la interfaz de usuario deje de responder.Extensions also impact Visual Studio performance when they cause the UI to become unresponsive. Para obtener más información sobre este tema, consulte Cómo: retrasos de la interfaz de usuario diagnosticar causados por las extensiones.For more on this topic, see How to: Diagnose UI delays caused by extensions.

Cómo las extensiones pueden afectar al inicioHow extensions can impact startup

Una de las maneras más comunes para las extensiones afectar al rendimiento de inicio es mediante la carga automática en uno de los contextos de interfaz de usuario de inicio conocidos como NoSolutionExists o ShellInitialized.One of the most common ways for extensions to impact startup performance is by choosing to auto load at one of the known startup UI contexts such as NoSolutionExists or ShellInitialized. Activar estos contextos de interfaz de usuario durante el inicio.These UI contexts get activated during startup. Todos los paquetes que incluyen el ProvideAutoLoad atributo en su definición de estos contextos se cargarán y se inicializan en ese momento.Any packages that include the ProvideAutoLoad attribute in their definition with those contexts will be loaded and initialized at that time.

Cuando se mide el impacto de una extensión, nos centramos principalmente en el tiempo invertido por las extensiones que elija para la carga automática en los contextos anteriores.When we measure the impact of an extension, we primarily focus on time spent by those extensions that choose to auto load in the contexts above. Mide podrían incluir pero no limitarse a veces:Measured times would include but not be limited to:

  • Carga de ensamblados de extensión para los paquetes sincrónicosLoading of extension assemblies for synchronous packages
  • Tiempo invertido en el constructor de clase de paquete para paquetes sincrónicosTime spent in the package class constructor for synchronous packages
  • Tiempo invertido en el método de inicialización (o SetSite) de paquete para los paquetes sincrónicosTime spent in package Initialize (or SetSite) method for synchronous packages
  • Para paquetes asincrónicos, las operaciones anteriores se ejecutan en el subproceso en segundo plano.For asynchronous packages, the above operations run on background thread. Por lo tanto, las operaciones se excluyen de la supervisión.As such, the operations are excluded from monitoring.
  • Tiempo invertido en ningún trabajo asincrónico programado durante la inicialización del paquete se ejecute en el subproceso principalTime spent in any asynchronous work scheduled during package initialization to run on main thread
  • Tiempo invertido en controladores de eventos, específicamente la activación de contexto shell inicializado o el cambio de estado inerte shellTime spent in event handlers, specifically shell initialized context activation or the shell zombie state change
  • A partir de Visual Studio 2017 Update 3, también comenzaremos a supervisar el tiempo invertido en llamadas inactivo antes de inicializa el shell de.Starting from Visual Studio 2017 Update 3, we will also start monitoring time spent in on idle calls before shell is initialized. Las operaciones largas en inactividad controladores también provocar IDE no responde y contribuyen al tiempo de inicio percibido por el usuario.Long operations in idle handlers also cause unresponsive IDE and contribute to perceived startup time by user.

Hemos agregado muchas características a partir de Visual Studio 2015.We have added many features starting from Visual Studio 2015. Estas características ayudan con la eliminación de la necesidad de paquetes de carga automático.These features help with removing the need for packages to auto load. Las características también posponer la necesidad de paquetes para cargar los casos más específicas.The features also postpone the need for packages to load to more specific cases. Estos casos incluyen ejemplos donde los usuarios podrían más determinados usar la extensión o reducir el impacto de una extensión cuando se cargan automáticamente.These cases include examples where users would be more certain to use the extension or reduce an extension impact when loading automatically.

Puede encontrar más detalles sobre estas características en los siguientes documentos:You can find more details about these features in the following documents:

Contextos de interfaz de usuario basada en reglas: un motor más completo de están basadas en reglas creado en torno a los contextos de interfaz de usuario le permite crear contextos personalizados basados en tipos de proyecto sabores y los atributos.Rule-based UI contexts: A richer rule-based engine built around UI contexts allows you to create custom contexts based on project types, flavors, and attributes. Contextos personalizados pueden utilizarse para cargar un paquete durante escenarios más específicos.Custom contexts can be used to load a package during more specific scenarios. Estos escenarios específicos incluyen la presencia de un proyecto con una función específica en lugar de inicio.These specific scenarios include the presence of a project with a specific capability instead of startup. También permiten contextos personalizados comando visibilidad esté vinculada a un contexto personalizado en función de los componentes del proyecto u otros términos disponibles.Custom contexts also allow command visibility to be tied to a custom context based on project components or other available terms. Esta característica elimina la necesidad de cargar un paquete para registrar un controlador de consulta de estado de comandos.This feature eliminates the need to load a package to register a command status query handler.

Compatibilidad con paquetes asincrónica: la nueva clase de base de AsyncPackage en Visual Studio 2015 permite que los paquetes de Visual Studio que se cargue en segundo plano forma asincrónica si se ha solicitado la carga del paquete mediante un atributo de la carga automática o una consulta de servicio asincrónico .Asynchronous package support: The new AsyncPackage base class in Visual Studio 2015 allows Visual Studio packages to be loaded in the background asynchronously if package load was requested by an auto load attribute or an asynchronous service query. Esta carga en segundo plano permite que el IDE a fin de responder.This background loading allows the IDE to stay responsive. El IDE está respondiendo incluso mientras se inicializa la extensión en segundo plano y no se verá afectados escenarios críticos, como la carga de inicio y la solución.The IDE is responsive even while the extension is initialized in the background and critical scenarios like startup and solution load wouldn't be impacted.

Servicios asincrónicos: con compatibilidad asincrónica de paquete, también hemos agregado compatibilidad para consultar los servicios de forma asincrónica y poder registrar los servicios asincrónicos.Asynchronous services: With asynchronous package support, we also added support for querying services asynchronously and being able to register asynchronous services. Más importante aún estamos trabajando de conversión de los servicios de Visual Studio principales para admitir la consulta asincrónica para que se produzca la mayoría del trabajo en una consulta de async en subprocesos en segundo plano.More importantly we are working on converting core Visual Studio services to support asynchronous query so that the majority of work in an async query occurs in background threads. SComponentModel (host de MEF de Visual Studio) es uno de los servicios principales que ahora es compatible con una consulta asincrónica para permitir las extensiones admitir la carga asincrónica por completo.SComponentModel (Visual Studio MEF host) is one of the major services that now supports asynchronous query to allow extensions to support asynchronous loading completely.

Reducir el impacto de auto extensiones cargadasReducing impact of auto loaded extensions

Si todavía necesita un paquete se carga al inicio de automáticamente, es importante minimizar el trabajo realizado durante la inicialización del paquete.If a package still needs to be auto loaded at startup, it is important to minimize the work done during package initialization. Minimizar el trabajo de inicialización del paquete reduce las posibilidades de la extensión que afectan a inicio.Minimizing the package initialization work reduces the chances of the extension impacting startup.

Algunos ejemplos que podrían provocar que la inicialización costoso paquete son:Some examples that could cause package initialization to be expensive are:

Uso de la carga del paquete sincrónico en lugar de la carga del paquete asincrónicaUse of synchronous package load instead of asynchronous package load

Porque los paquetes sincrónicos se cargan en el subproceso principal de forma predeterminada, le animamos a los propietarios de extensión que tienen paquetes de carga automáticamente para usar la clase base paquete asincrónica en su lugar como se mencionó anteriormente.Because synchronous packages are loaded on the main thread by default, we encourage extension owners that have auto loaded packages to use the asynchronous package base class instead as mentioned earlier. Cambiar un paquete de carga automática para admitir cargas asincrónicas también resultará más fácil de resolver los problemas siguientes.Changing an auto loaded package to support asynchronous loading will also make it easier to resolve the other issues below.

Solicitudes de E/S de archivo sincrónicas/redSynchronous file/network IO requests

Lo ideal es que se debe evitar cualquier solicitud de E/S de archivos o red sincrónico en el subproceso principal.Ideally any synchronous file or network IO request should be avoided in the main thread. Su impacto dependerá de estado de la máquina y se puede bloquear durante largos períodos de tiempo en algunos casos.Their impact will depend on machine state and can block for long periods of time in some cases.

Utilizando la carga del paquete asincrónica y las API de E/S asincrónicas debe asegurarse que la inicialización del paquete no bloquea el subproceso principal en estos casos.Using asynchronous package loading and asynchronous IO APIs should make sure that package initialization doesn't block the main thread in such cases. Los usuarios también pueden continuar interactuar con Visual Studio, mientras que las solicitudes de E/S que se producen en segundo plano.Users also can continue to interact with Visual Studio while I/O requests happen in background.

Inicialización temprana de servicios, componentesEarly initialization of services, components

Uno de los patrones comunes de inicialización del paquete consiste en inicializar los servicios proporcionados por ese paquete en el paquete o utilizado por constructor o initialize método.One of the common patterns in package initialization is to initialize services either used by or provided by that package in the package constructor or initialize method. Aunque esto garantiza que los servicios están listos para usarse, también puede agregar costos innecesarios para empaquetar la carga si esos servicios no se utilizan inmediatamente.While this ensures services are ready to be used, it can also add unnecessary cost to package loading if those services are not used immediately. En su lugar se deben inicializar dichos servicios a petición para minimizar el trabajo realizado en la inicialización del paquete.Instead such services should be initialized on demand to minimize the work done in package initialization.

Proporcionado por un paquete de servicios globales, puede usar AddService métodos que toman una función para inicializar el servicio de forma diferida solo cuando se solicita un componente.For global services provided by a package, you can use AddService methods that take a function to lazily initialize the service only when it is requested by a component. Para los servicios utilizados dentro del paquete, puede usar Lazy o elemento AsyncLazy para asegurarse de que los servicios son inicializado ni consultarse en el primer uso.For services used within the package, you can use Lazy or AsyncLazy to make sure that services are initialized/queried on first use.

Medición del impacto de auto carga extensiones mediante el registro de actividadMeasuring impact of auto loaded extensions using Activity log

A partir de Visual Studio 2017 Update 3, registro de actividad de Visual Studio ahora contendrá las entradas de impacto en el rendimiento de los paquetes durante la carga de inicio y la solución.Beginning in Visual Studio 2017 Update 3, Visual Studio activity log will now contain entries for performance impact of packages during startup and solution load. Para ver estas mediciones, tiene que iniciar Visual Studio con el modificador/log y abra ActivityLog.xml archivo.In order to see these measurements, you have to start Visual Studio with /log switch and open ActivityLog.xml file.

En el registro de actividad, las entradas se encontrarán en el origen de "Administrar el rendimiento de Visual Studio" y tendrá un aspecto similar al ejemplo siguiente:In the activity log, the entries will be under "Manage Visual Studio Performance" source, and will look like the following example:

Component: 3cd7f5bf-6662-4ff0-ade8-97b5ff12f39c, Inclusive Cost: 2008.9381, Exclusive Cost: 2008.9381, Top Level Inclusive Cost: 2008.9381

En este ejemplo muestra que un paquete con el GUID "3cd7f5bf-6662-4ff0-ade8-97b5ff12f39c" dedicado a 2008 ms en el inicio de Visual Studio.This example shows that a package with GUID "3cd7f5bf-6662-4ff0-ade8-97b5ff12f39c" spent 2008 ms in startup of Visual Studio. Tenga en cuenta que Visual Studio tiene en cuenta el costo de nivel superior como el número principal al calcular el impacto de un paquete, ya que sería que verán los usuarios de ahorro cuando deshabilita la extensión de ese paquete.Note that Visual Studio considers top-level cost as the primary number when calculating impact of a package as that would be the savings users see when they disable the extension for that package.

Medición del impacto de auto carga extensiones mediante PerfViewMeasuring impact of auto loaded extensions using PerfView

Mientras el análisis de código puede ayudar a identificar las rutas de código que pueden ralentizar la inicialización del paquete, también puede utilizar el seguimiento mediante el uso de aplicaciones como PerfView para comprender el impacto de un paquete de carga en el inicio de Visual Studio.While code analysis can help identify code paths that can slow down package initialization, you can also utilize tracing by using applications like PerfView to understand the impact of a package load in Visual Studio startup.

PerfView es una herramienta de seguimiento de todo el sistema.PerfView is a system-wide tracing tool. Esta herramienta le ayudará a comprender las rutas de acceso activas en una aplicación, ya sea debido a uso de CPU o bloquear las llamadas del sistema.This tool will help you understand hot paths in an application either because of CPU usage or blocking system calls. A continuación es un ejemplo rápido acerca de cómo analizar una extensión de ejemplo con PerfView disponible en el Microsoft Download Center.Below is a quick example on analyzing a sample extension using PerfView available at the Microsoft Download Center.

Ejemplo de código:Example code:

En este ejemplo se basa en el ejemplo de código siguiente, que está diseñado para mostrar algunas causas comunes de retraso de casos:This example is based on the sample code below, which is designed to show case some common delay causes:

protected override void Initialize()
{
    // Initialize a class from another assembly as an example
    MakeVsSlowServiceImpl service = new MakeVsSlowServiceImpl();

    // Costly work in main thread involving file IO
    string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
    foreach (string file in Directory.GetFiles(systemPath))
    {
        DateTime creationDate = File.GetCreationTime(file);
    }

    // Costly work after shell is initialized. This callback executes on main thread
    KnownUIContexts.ShellInitializedContext.WhenActivated(() =>
    {
        DoMoreWork();
    });

    // Start async work on background thread
    DoAsyncWork().Forget();
}

private async Task DoAsyncWork()
{
    // Switch to background thread to do expensive work
    await TaskScheduler.Default;
    System.Threading.Thread.Sleep(500);
}

private void DoMoreWork()
{
    // Costly work
    System.Threading.Thread.Sleep(500);
    // Blocking call to an asynchronous work.
    ThreadHelper.JoinableTaskFactory.Run(async () => { await DoAsyncWork(); });
}

Grabación de un objeto trace con PerfView:Recording a trace with PerfView:

Una vez configurado el entorno de Visual Studio con la extensión instalada, puede registrar un seguimiento del inicio, abra PerfView y abra el recopilar cuadro de diálogo desde el recopilar menú.Once you set up your Visual Studio environment with your extension installed, you can record a trace of startup by opening PerfView and opening the Collect dialog from the Collect menu.

menú recopilar perfview

Las opciones predeterminadas proporcionará las pilas de llamadas para el consumo de CPU, pero puesto que estamos interesados en tiempo de bloqueo, también debe habilitar tiempo subprocesos pilas.The default options will provide call stacks for CPU consumption but since we are interested in blocking time as well, you also should enable Thread Time stacks. Una vez que la configuración esté lista, puede hacer clic en iniciar colección e iniciar Visual Studio una vez que se inicia la grabación.Once the settings are ready you can click on Start Collection and start Visual Studio once recording is started.

Antes de detener la recopilación, desea asegurarse de que Visual Studio está completamente inicializado, la ventana principal está completamente visible y si la extensión tiene interfaz de usuario que se muestran automáticamente, también están visibles.Before you stop collection, you want to make sure Visual Studio is fully initialized, the main window is completely visible and if your extension has any UI pieces that automatically show, they are also visible. Una vez que Visual Studio se cargó completamente y se inicializa la extensión, puede detener la grabación para analizar el seguimiento.Once Visual Studio is completely loaded and your extension is initialized, you can stop recording to analyze the trace.

Analizar un seguimiento con PerfView:Analyzing a trace with PerfView:

Una vez completada la grabación de PerfView automáticamente se abra el seguimiento y expanda las opciones.Once recording is completed PerfView will automatically open the trace and expand options.

Para los fines de este ejemplo, nos interesa principalmente la las pilas de subprocesos en tiempo vista que puede encontrar en Advanced Group.For the purposes of this example, we are mainly interested in the Thread Time Stacks view which you can find under Advanced Group. Esta vista mostrará el tiempo total invertido en un subproceso por un método como el tiempo de CPU y tiempo de bloqueo, como E/S de disco o en espera en identificadores.This view will show total time spent on a thread by a method including both CPU time and blocked time, such as disk IO or waiting on handles.

tiempo pilas de subprocesos

Mientras se abre las pilas de subprocesos en tiempo ver, debe elegir el devenv proceso para iniciar el análisis.While opening Thread Time Stacks view, you should choose the devenv process to start analysis.

PerfView ha orientación detallada acerca de cómo se leen las pilas en tiempo en su propio menú de ayuda para un análisis más detallado de subproceso.PerfView has detailed guidance on how to read thread time stacks under its own Help menu for more detailed analysis. Para fines de este ejemplo, desea filtrar aún más esta vista solo incluyendo pilas con el subproceso de inicio y el nombre de módulo de paquetes.For purposes of this example, we want to filter this view further by only including stacks with our packages module name and startup thread.

  1. Establecer GroupPats en texto vacío para quitar cualquier agrupación que se agrega de forma predeterminada.Set GroupPats to empty text to remove any grouping added by default.
  2. Establecer IncPats para incluir parte de su nombre de ensamblado y el inicio del subproceso además de filtro de proceso existente.Set IncPats to include part of your assembly name and Startup Thread in addition to existing process filter. En este caso, debe ser devenv; Subproceso de inicio; MakeVsSlowExtension.In this case, it should be devenv;Startup Thread;MakeVsSlowExtension.

Ahora la vista solo mostrará el costo asociado con los ensamblados relacionados con la extensión.Now the view will only show cost that is associated with the assemblies related to extension. En esta vista, siempre que se muestra bajo el Inc (costo inclusivo) columna del subproceso de inicio se relaciona con nuestra extensión filtrado y se pueden influir en el inicio.In this view, any time listed under the Inc (Inclusive cost) column of startup thread is related to our filtered extension and will be impacting startup.

Para el ejemplo anterior, algunos interesante llamada pilas sería:For the example above some interesting call stacks would be:

  1. Uso de E/S System.IO clase: mientras inclusivo costo de estos marcos podría no ser demasiado costosa en el seguimiento, son una posible causa de un problema ya que la velocidad de E/S de archivos puede variar de un equipo a otro.IO using System.IO class: While inclusive cost of these frames might not be too expensive in the trace, they are a potential cause of an issue since file IO speed will vary from machine to machine.

    marcos de e/s del sistema

  2. Bloqueo de las llamadas a la espera en otro trabajo asincrónico: en este caso, el tiempo inclusivo representaría el tiempo que se bloquea el subproceso principal tras la finalización del trabajo asincrónico.Blocking calls waiting on other asynchronous work: In this case, inclusive time would represent the time the main thread is blocked on the completion of asynchronous work.

    marcos de llamada de bloqueo

Una de las otras vistas en el seguimiento que resultarán útiles para conocer el impacto será el pilas de carga de imágenes.One of the other views in the trace that will be useful to determine impact will be the Image Load Stacks. Puede aplicar los mismos filtros que se aplican a las pilas de subprocesos en tiempo ver y averiguar todos los ensamblados cargados por el código ejecutado por el paquete cargado automáticamente.You can apply the same filters as applied to Thread Time Stacks view and find out all assemblies loaded because of the code executed by your auto loaded package.

Es importante minimizar el número de ensamblados cargados dentro de una rutina de inicialización del paquete como cada ensamblado adicional implicará la E/S de disco adicional que puede ralentizar el inicio considerablemente en equipos más lentos.It is important to minimize number of loaded assemblies inside a package initialization routine as each additional assembly will involve extra disk I/O which can slow down startup considerably on slower machines.

ResumenSummary

Inicio de Visual Studio ha sido una de las áreas en que continuamente recibimos comentarios.Startup of Visual Studio has been one of the areas we continually get feedback on. Nuestro objetivo, como se indicó anteriormente es para que todos los usuarios tengan un inicio coherente experiencia independientemente de los componentes y extensiones que han instalado.Our goal as stated earlier is for all users to have a consistent startup experience regardless of components and extensions they have installed. Nos gustaría trabajar con los propietarios de extensión que les ayuden a alcanzar ese objetivo.We would like to work with extension owners to help them help us achieve that goal. Las instrucciones anteriores deben ser útil para comprender un impacto de las extensiones en el inicio y o evitar la necesidad de auto carga o cargarlo de forma asincrónica para minimizar el impacto en la productividad del usuario.The guidance above should be helpful in understanding an extensions impact on startup and either avoiding the need to auto load or load it asynchronously to minimize impact on user productivity.