Compartir a través de


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:

Minimización del uso de memoria

Existen varias maneras de minimizar la cantidad de memoria que usa la aplicación de Windows; para ello, puede hacer lo siguiente:

  • Reducción del uso de memoria en primer plano.
  • Minimización del trabajo en segundo plano.
  • Liberación de recursos en segundo plano.
  • Garantía de que la aplicación no pierde memoria

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

Una vez que obtenga un seguimiento del sistema que quiera analizar, le recomendaremos una guía para aplicar el análisis de seguimiento para reducir el uso de memoria.

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

El conjunto de trabajo de una aplicación (esto es, 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 runtime, 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 y a reducir el coste de CPU asociado 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 terminará 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; asimismo, si es necesario, recortará y paginará el contenido que se haya usado anteriormente. Cuando el usuario vuelve al shell o a 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 de las operaciones debido a este proceso.

Hay dos partes clave en la memoria que usa 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 las bases de datos que usa una aplicación. Normalmente no es un fragmento significativo del uso de memoria de una aplicación y, a menudo, una constante. (Las excepciones serían aplicaciones de procesamiento de datos, compilación de código, etc.). El origen más significativo del uso de memoria y donde las fugas se ponen de manifiesto, 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 un origen habitualmente significativo de uso de memoria y donde las fugas de memoria manifiestan.

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 use 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, tal como se describe a continuación.

Captura de un seguimiento del sistema para analizar el uso de 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 que así pueda saber cómo mejorar el rendimiento de la aplicación.

Los seguimientos pueden variar de longitud:

  • Se puede usar un seguimiento de ejecución corta para capturar el inicio 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 la aplicación sigue en marcha.
  • Un seguimiento de larga duración (normalmente de varios minutos de duración), es útil para diagnosticar pérdidas de memoria. Si el uso de memoria continúa aumentando con el tiempo, esto suele indicar que hay alguna pérdida.

Tiene 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 de Windos Performance Analyzer. Para obtener más información sobre cómo elegir una herramienta para generar perfiles de rendimiento de la aplicación, consulte Selección entre Generador de perfiles de rendimiento de Visual Studio, Windows Performance Toolkit y PerfView.

Para realizar una captura de seguimiento:

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

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

  3. Ejecute el escenario que esté investigando. (Inicie la aplicación, por ejemplo).

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

Análisis del seguimiento del sistema

Para saber cuál de las funciones de la aplicación tiene asignada memoria que puede reducir, debe analizar el seguimiento del sistema que se capturó. Para analizar el seguimiento:

  1. Abra el seguimiento mediante Windows Performance Analyzer y 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 de confirmación total y seleccione Agregar gráfico a la nueva vista de análisis.

  3. Abra el Editor de vistas; para ello, haga clic en el icono de engranaje Configuración y seleccione la siguiente disposición de columnas: Proceso, Tipo de confirmación, Pila de confirmación y Tamaño.

  4. Haga clic en el encabezado de LA columna Tamaño para que los resultados se ordenen en orden descendente. La pila de confirmación muestra la ruta de acceso al código que hace que se asigne la memoria. Estos resultados pueden ayudarle 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 optimización.

  5. Filtre los procesos que le quiera 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. Vaya a la pila de confirmación para saber qué funciones tienen memoria asignada. Las pilas de confirmación necesitarán tener símbolos cargados. Para cargar símbolos, seleccione Seguimiento>Cargar símbolos en la barra del menú de navegación superior.

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

Aplicación del 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.

Estas son algunas áreas que debe tener en cuenta en la aplicación del análisis de seguimiento para actualizar el código para reducir el uso de memoria:

  • 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 reducirlo o quitar ese uso.

  • Minimizar el trabajo en segundo plano: el sistema tiene directivas para eliminar la edad de las páginas de los conjuntos de trabajo del proceso. Al usar menos memoria en segundo plano, el sistema es más eficaz ya que mantiene menos residentes en memoria de la aplicación. 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, ya que esto también se traducirá en el uso de menos memoria en segundo plano.

  • Liberar recursos en segundo plano: en runtime, una aplicación puede crear algunas caché de memoria, 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 es visible. Una aplicación puede registrarse para que las notificaciones de que queda poca memoria realicen esta acción, pero una mejor estrategia puede ser liberar memoria después de pasar un período sin usarla, cuando la aplicación concluye 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, media hora o más. Debe tener cuidado a la hora de 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 un punto de referencia de estado estable, donde el uso de memoria de la aplicación sea constante o no crezca más allá de un valor determinado. Puede establecer este estado constante mediante el uso continuo de la aplicación o dejarla inactiva en segundo plano. Al usar el seguimiento que ha capturado para identificar una posible fuga de memoria, puede buscar dónde se asigna esa memoria en el código y cómo se puede dejar de usar después de que haya servido a su propósito. Si la memoria sigue creciendo a medida que se ejecuta la aplicación, es probable que se indique una fuga de memoria. Puede hacer zoom en la región correspondiente al crecimiento dentro del seguimiento y analizar cuidadosamente las pilas de confirmación.

Utilización 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 optimizarla.

Hay varias maneras de reducir la superficie de disco de la aplicación para 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 se puedan usar E/S más grandes.

  • Un disco completo puede traducirse en 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 tipo "leer-modificar-escribir", 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 de forma poco eficaz.

Estas son algunas maneras de reducir el espacio en disco o usarlo de forma más eficiente:

  • Aplicar principios de "pago por juego" a la superficie de disco (descargar solo lo que necesite): una aplicación puede incluir una amplia gama de características, pero no todas se aplicarán a todos los usuarios. Esto puede ser una razón para tener una superficie de disco de gran tamaño. Al aplicar los principios de "pago por juego", puede pedir a los usuarios que descarguen solo las características que necesiten, por lo que la superficie de disco será más pequeña cuando descarguen la aplicación. El contenido adicional se convierte en opcional para la descarga solo cuando el usuario necesita obtener 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 idiomas populares de manera predeterminada, que cuente con idiomas adicionales incluidos opcionalmente o que sean 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é; por ejemplo, puede establecer un límite superior en el tamaño de la 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 sea bajo.

  • Aplicar un uso eficaz de los recursos: una aplicación suele incluir recursos de imagen y puede tener 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 binarias: herramientas, como SizeBench, permiten a los autores de aplicaciones investigar qué contribuye a la superficie binaria y encontrar oportunidades para reducir la cantidad de espacio en disco que se usa.

Recursos adicionales