Compartir por


Mejora del rendimiento de la aplicación al reducir el uso de memoria y espacio en disco

En esta guía se muestra cómo mejorar el rendimiento de la aplicación de Windows de dos maneras principales:

Minimizar el uso de memoria

Hay una variedad de maneras de minimizar la cantidad de memoria que usa la aplicación de Windows, puede hacer lo siguiente:

  • Reducción del uso de memoria en primer plano
  • Minimizar el trabajo en segundo plano
  • Liberar recursos en segundo plano
  • Asegúrese de que la aplicación no pierde memoria

Para minimizar adecuadamente el uso de memoria, primero es importante comprender lo siguiente:

Una vez que tenga un seguimiento del sistema para analizar, le recomendaremos orientación para aplicar su análisis de seguimiento con el fin de reducir el uso de memoria.

Conjunto de trabajo, memoria dinámica y asignación virtual

El conjunto de trabajo de una aplicación ( el conjunto de páginas en su espacio de direcciones virtual que actualmente reside en la memoria) es una medida del uso de memoria de la aplicación.

La cantidad de memoria que usa una aplicación afecta a su rendimiento en tiempo de ejecución, así como a la capacidad de respuesta del sistema en su conjunto. Minimizar el uso de memoria ayudará a la aplicación a mejorar el rendimiento al reducir los costos de CPU asociados con el acceso a más memoria. Reducir el uso de memoria también ayuda con la capacidad de respuesta del sistema y la experiencia del usuario de la aplicación en general, ya que la aplicación no termina desplazando otro contenido de memoria.

El desplazamiento de memoria puede ocurrir cuando el sistema intenta conservar el contenido en memoria al que se accede recientemente y, si es necesario, recortará y paginará el contenido usado anteriormente. Cuando el usuario vuelve al shell u otra aplicación, y los datos necesarios no residen en la memoria, los datos deberán leerse desde el disco. Es probable que el usuario note una ralentización debido a este proceso.

Hay dos partes clave en la memoria usada por una aplicación: 1) memoria dinámica y 2) memoria respaldada por archivos. El uso de memoria respaldada por archivos procede de archivos binarios y archivos de datos, como bases de datos, usadas por una aplicación. Normalmente no representa una parte significativa del uso de memoria de una aplicación y suele ser constante. (Las excepciones serían aplicaciones de procesamiento de datos, compilación de código, etc.) La fuente más significativa de uso de memoria y donde se manifiestan las fugas es la memoria dinámica.

La memoria dinámica corresponde a la memoria virtual asignada por una aplicación mediante rutinas de asignación de memoria. A diferencia de la memoria respaldada por archivos, que persiste en los reinicios del sistema, la memoria dinámica solo existe durante la vigencia de la aplicación. La memoria dinámica es una fuente significativa de uso de memoria y donde se manifiestan las fugas de memoria.

Las rutinas de asignación virtual (VirtualAlloc) controlan las solicitudes de asignación de memoria desde una aplicación de Windows independientemente de la rutina de capa de aplicación que se usa para la asignación de memoria. Aunque no toda la memoria asignada por una aplicación puede residir en la memoria todo el tiempo, el análisis de estas asignaciones proporciona una manera coherente de comprender el uso de memoria de una aplicación.

Para comprender el uso de memoria de la aplicación y buscar lugares para realizar mejoras, se recomienda capturar un seguimiento de VirtualAllocation como se describe a continuación.

Captura un rastreo del sistema para analizar el uso de la memoria

La grabación de la actividad del dispositivo durante un período de tiempo se conoce como seguimiento del sistema. El seguimiento del sistema genera un archivo de seguimiento que se puede usar para generar un informe y ayudarle a identificar cómo mejorar el rendimiento de la aplicación.

Las trazas pueden variar en longitud.

  • Se puede usar un seguimiento corto de ejecución para capturar el lanzamiento de una aplicación. Esto puede incluir la transición de la aplicación al estado inactivo, donde se minimiza la ventana de la aplicación o las ventanas de la aplicación se cierran mientras el proceso de aplicación persiste.
  • Un seguimiento de larga duración, normalmente varios minutos de duración, es útil para diagnosticar pérdidas de memoria. Si el uso de memoria continúa aumentando con el tiempo, suele ser sugerente de una pérdida.

Hay varias herramientas disponibles para supervisar el uso de memoria, entre las que se incluyen:

Para los fines de este artículo, nos centraremos en el uso del Analizador de rendimiento de Windows. Para obtener más información sobre cómo elegir una herramienta para generar perfiles del rendimiento de la aplicación, vea Elegir entre Visual Studio Performance Profiler, Windows Performance Toolkit y PerfView.

Para capturar una traza:

  1. Abra una línea de comandos (PowerShell o símbolo del sistema) en modo de administrador. (Si no se ejecuta en modo de administrador, puede recibir código de error: 0xc5585011, "No se pudo habilitar la directiva para generar perfiles del rendimiento del sistema").

  2. Escriba el comando: wpr -start VirtualAllocation -filemode

  3. Ejecuta el escenario que estás analizando. (Iniciar la aplicación, por ejemplo).

  4. Escriba el comando: wpr -stop Trace.etl

Análisis del seguimiento del sistema

Para encontrar cuál de las funciones de la aplicación ha asignado memoria que se puede reducir, ahora debe analizar la traza del sistema que se capturó. Para analizar la traza:

  1. Para abrir el seguimiento mediante el Analizador de rendimiento de Windows, escriba el comando : wpa.exe Trace.etl

  2. En la ventana del Explorador de Gráficos, expanda la sección Memoria, haga clic con el botón derecho en el gráfico Compromiso total y seleccione Agregar gráfico a la nueva vista de análisis.

  3. Para abrir el Editor de vistas , haga clic en el engranaje Configuración y seleccione la siguiente disposición de columna: Procesar, Tipo de confirmación, Pila de confirmación y Tamaño.

  4. Haga clic en el encabezado de columna Tamaño para que los resultados se ordenan en orden descendente. La pila de confirmación muestra la ruta de acceso de código que conduce a que se asigne memoria. Estos resultados pueden ayudar a comprender el motivo de la asignación. La ordenación por tamaño le permite centrarse en las asignaciones más grandes e investigar si hay una oportunidad de optimizar.

  5. Filtre por los procesos que le interese analizar haciendo clic con el botón derecho en el proceso y seleccionando Filtrar a selección.

  6. Para acercar la región de interés en la ventanilla, seleccione un intervalo, haga clic con el botón derecho en el gráfico y seleccione Zoom.

  7. Navegue por la Stack de commits para comprender qué funciones tienen memoria asignada. Las pilas de confirmación necesitarán símbolos cargados. Para cargar símbolos, seleccione Rastreo>Cargar símbolos en la barra de menús de navegación superior.

    Captura de pantalla de seguimiento de memoria del Analizador de rendimiento de Windows

Aplicar el análisis de seguimiento para reducir el uso de memoria

Al analizar la memoria asignada, encontrará pistas que le ayudarán a decidir dónde se puede minimizar el uso de memoria.

Algunas áreas que se deben tener en cuenta con respecto a la aplicación del análisis de seguimiento para actualizar el código para reducir el uso de memoria, incluyen:

  • Reducir el uso de memoria en primer plano: analizar el seguimiento de memoria puede ayudarle a identificar cualquier uso de memoria innecesario en primer plano y actualizar el código para reducir o quitar ese uso.

  • Minimizar el trabajo mientras está en segundo plano: el sistema tiene políticas para eliminar las páginas de los conjuntos de trabajo del proceso cuando se vuelven menos relevantes. El uso de menos memoria en segundo plano permite que el sistema sea más eficiente al mantener menos memoria de la aplicación en funcionamiento. Obtenga más información sobre cómo mejorar el consumo de energía y la duración de la batería al minimizar el trabajo en segundo plano, lo que también se traducirá en el uso de menos memoria en segundo plano.

  • Liberar recursos en segundo plano: En tiempo de ejecución, una aplicación puede crear algunas memorias caché, así como crear asignaciones de gráficos para admitir su interfaz de usuario. Estas asignaciones pueden liberarse cuando la aplicación está minimizada o no visible. Una aplicación puede registrarse para recibir notificaciones de baja memoria y realizar esta acción, pero una mejor estrategia puede ser liberar memoria después de un período de inactividad, cuando la aplicación determine que está inactiva. Este período de desuso puede variar según la aplicación, por lo que los posibles indicadores de uso inactivo pueden oscilar entre unos minutos y 1/2 hora o más. Se debe tener cuidado para equilibrar este tipo de ahorro de memoria con capacidad de respuesta. Si una memoria caché es costosa de recompilar, la aplicación puede optar por conservarla durante la vigencia de la aplicación.

  • Asegúrese de que la aplicación no pierde memoria: para comprobar si hay fugas de memoria, primero establezca una prueba comparativa de estado estable, donde el uso de memoria de la aplicación se aplane o no crezca más allá de un valor determinado. Puede establecer este estado estable mediante el uso continuo de la aplicación o dejarla inactiva en segundo plano. Con el rastro que ha capturado para identificar una posible pérdida de memoria, puede encontrar dónde se asigna esa memoria en el código y cómo se puede liberar una vez cumplido su propósito. Si la memoria sigue creciendo a medida que se ejecuta la aplicación, es probable que se indique una pérdida de memoria. Acérquese a la región que corresponde al incremento dentro de su seguimiento y analice cuidadosamente las pilas de commits.

Uso eficaz del espacio en disco

La superficie de disco hace referencia al tamaño de una aplicación cuando se almacena en un estado inactivo (no se ejecuta código). Si la aplicación ocupa una gran cantidad de superficie de disco, puede ser una oportunidad para optimizar.

Hay varias maneras de reducir la superficie de disco de la aplicación puede mejorar el rendimiento:

  • A medida que un disco se llena, el sistema de archivos ya no puede almacenar contenido nuevo de forma contigua. Un disco completo se fragmenta, almacenando contenido nuevo en sectores no contiguos. Esto se traduce en un tiempo de latencia más largo cuando se accede a ese contenido desde el disco. Los sistemas de E/S proporcionarán un rendimiento de disco mucho mejor cuando el contenido sea contiguo y se pueda acceder secuencialmente o usar E/S más grandes.

  • Un disco completo puede traducirse a latencias de escritura más largas para sistemas basados en SSD. Cuando hay menos celdas vacías para absorber escrituras, una escritura puede incurrir en una operación de lectura-modificación-escritura, lo que ralentiza el rendimiento.

  • Un disco completo puede dificultar la capacidad de actualizar la aplicación. Aunque el sistema operativo es resistente y capaz de mantener el sistema actualizado y seguro, incluso con poco espacio disponible en disco, una cantidad correcta de espacio en disco disponible para almacenar provisionalmente el contenido de la actualización de la aplicación se traducirá en una experiencia de actualización más rápida y fluida.

  • La necesidad de tener acceso a una cantidad significativa de una superficie de disco grande en tiempo de ejecución también se traducirá en el uso de memoria. Esto afectará a la capacidad de respuesta de la aplicación y al sistema en general. Además, si se requiere una pequeña proporción de la superficie de disco en tiempo de ejecución, la aplicación puede usar espacio en disco ineficazmente.

Entre las siguientes se incluyen algunas maneras de reducir o ser más eficientes con el espacio en disco:

  • Aplicar principios de "pagar por el uso" al espacio en disco (descargar solo lo que necesite): una aplicación puede incluir una amplia gama de características donde no todas las características son aplicables a todos los usuarios. Esto puede ser una razón para una gran huella en disco. Al aplicar los principios de "pago por juego", puede pedir a los usuarios que seleccionen solo para descargar las características que necesitan, lo que se traduce a una superficie de disco más pequeña cuando descargan la aplicación. El contenido adicional se convierte en opcional para la descarga solo cuando el usuario tiene una necesidad de funcionalidades más enriquecidas. Además de las características, puede aplicar los mismos principios de "pago por juego" a la compatibilidad con idiomas. La aplicación puede incluir un subconjunto de opciones de idioma populares de forma predeterminada, con idiomas adicionales opcionalmente incluidos o dependientes de la ubicación establecida en el sistema del usuario.

  • Aplicar un ajuste de tamaño de caché eficaz: en algunos casos, una aplicación puede usar cachés en disco para que la experiencia del usuario sea más dinámica. Las directivas se pueden establecer para la forma en que la aplicación administra la memoria caché, con un límite superior establecido en el tamaño de caché en función de la capacidad del disco y cambiar el tamaño de la memoria caché cuando el espacio disponible en el disco es bajo.

  • Aplicar un uso eficaz de los recursos: una aplicación suele incluir recursos de imagen y puede constar de un intervalo de tamaño de imagen para admitir varias resoluciones. La optimización del tamaño de la imagen, las dimensiones, el formato y la compresión de un subconjunto de resoluciones y el aprovechamiento del escalado para admitir las resoluciones restantes puede reducir significativamente la superficie del disco.

  • Investigar oportunidades de optimización binaria: herramientas, como SizeBench, permiten a los autores de aplicaciones investigar lo que contribuye a la superficie binaria y encontrar oportunidades para reducir la cantidad de espacio en disco utilizado.

Recursos adicionales