Compartilhar via


Melhore o desempenho do aplicativo reduzindo o uso de memória e o espaço em disco

Este guia demonstrará como melhorar o desempenho de aplicativos do Windows de duas maneiras principais:

Minimizar o uso de memória

Há várias maneiras de minimizar a quantidade de memória que o aplicativo do Windows usa, é possível:

  • Reduzir o uso de memória em primeiro plano.
  • Minimizar o trabalho em segundo plano.
  • Liberar recursos enquanto estiver em segundo plano.
  • Certificar-se de que o aplicativo não está vazando memória.

Para minimizar adequadamente o uso de memória, primeiro é importante entender:

Depois de ter um rastreamento do sistema para analisar, recomendaremos orientações para aplicar a análise de rastreamento para reduzir o uso de memória.

Conjunto de trabalho, memória dinâmica e alocação virtual

O conjunto de trabalho de um aplicativo (o conjunto de páginas em seu espaço de endereço virtual que atualmente residem na memória) é uma medida do uso de memória do aplicativo.

A quantidade de memória que um aplicativo usa afeta seu desempenho de tempo de execução, bem como a capacidade de resposta do sistema como um todo. Minimizar o uso de memória ajudará o aplicativo a ter um desempenho melhor, reduzindo os custos de CPU associados ao acesso a mais memória. O menor uso de memória também ajuda na capacidade de resposta do sistema e na experiência do usuário do aplicativo em geral, já que o aplicativo não acaba deslocando outros conteúdos de memória.

O deslocamento de memória pode acontecer à medida que o sistema tenta reter o conteúdo na memória acessado recentemente e, se necessário, cortará e eliminará o conteúdo usado anteriormente. Quando o usuário alterna de volta para o shell ou outro aplicativo e os dados necessários não residem na memória, os dados precisarão ser lidos do disco. O usuário provavelmente notará uma lentidão devido a esse processo.

Há duas peças-chave para a memória usada por um aplicativo: 1) memória dinâmica e 2) memória baseada em arquivo. O uso da memória baseada em arquivo vem de binários e arquivos de dados, como bancos de dados, usados por um aplicativo. Isso geralmente não é uma parte significativa do uso de memória de um aplicativo e, muitas vezes, uma constante. (As exceções seriam aplicativos de processamento de dados, compilação de código etc.) A fonte mais significativa de uso de memória e onde os vazamentos se manifestam é a memória dinâmica.

A memória dinâmica corresponde à memória virtual alocada por um aplicativo usando rotinas de alocação de memória. Ao contrário da memória baseada em arquivo, que persiste nas reinicializações do sistema, a memória dinâmica só existe durante a vida útil do aplicativo. A memória dinâmica é uma fonte comumente significativa de uso de memória e onde os vazamentos de memória se manifestam.

As rotinas de alocação virtual (VirtualAlloc) manipulam solicitações de alocação de memória de um aplicativo do Windows independentemente da rotina da camada de aplicativo usada para alocação de memória. Embora nem toda a memória alocada por um aplicativo possa estar residente na memória o tempo todo, analisar essas alocações fornece uma maneira consistente de entender o uso de memória de um aplicativo.

Para entender o uso de memória do seu aplicativo e encontrar locais para fazer melhorias, recomendamos capturar um rastreamento VirtualAllocation conforme descrito abaixo.

Capturar um rastreamento do sistema para analisar o uso de memória

O registro da atividade do dispositivo durante um período é conhecido como rastreamento do sistema. O rastreamento do sistema produz um arquivo de rastreamento que pode ser usado para gerar um relatório e ajudar você a identificar como melhorar o desempenho do aplicativo.

Os rastreamentos podem variar em duração:

  • Um rastreamento de execução curta pode ser usado para capturar a inicialização de um aplicativo. Isso pode incluir a transição do aplicativo para o estado inativo, em que a janela do aplicativo é minimizada ou as janelas do aplicativo são fechadas enquanto o processo do aplicativo persiste.
  • Um rastreamento de longa duração, normalmente vários minutos de duração, é útil no diagnóstico de vazamentos de memória. Se o uso de memória continuar a aumentar ao longo do tempo, isso geralmente é sugestivo de um vazamento.

Existem várias ferramentas disponíveis para monitorar o uso da memória, incluindo:

Para os fins deste artigo, vamos nos concentrar em usar o Windows Performance Analyzer. Para saber mais sobre como escolher uma ferramenta para criar o perfil do desempenho do seu aplicativo, consulte Escolher entre o Visual Studio Performance Profiler, o Windows Performance Toolkit e o PerfView.

Para capturar um rastreamento:

  1. Abra uma linha de comando (PowerShell ou Prompt de Comando) no modo de administrador. (Se não for executado no modo de administrador, será possível receber o código de erro: 0xc5585011 "Falha ao habilitar a política para o desempenho do sistema de perfil.")

  2. Insira o comando: wpr -start VirtualAllocation -filemode

  3. Execute o cenário que você está investigando. (Iniciando o aplicativo, por exemplo.)

  4. Insira o comando: wpr -stop Trace.etl

Analisar o rastreamento do sistema

Para encontrar quais funções do aplicativo têm memória alocada que é possível reduzir, agora você precisa analisar o rastreamento do sistema que foi capturado. Para analisar o rastreamento:

  1. Abra o rastreamento usando o WPA (Windows Performance Analyzer), digitando o comando: wpa.exe Trace.etl

  2. Na janela Explorador de Gráficos, expanda a seção Memória, clique com o botão direito do mouse no gráfico Total Commit e selecione Adicionar gráfico ao Novo Modo de Exibição de Análise.

  3. Abra o Editor de Exibição clicando na engrenagem Configurações e selecionando a seguinte disposição de coluna: Processo, Tipo de confirmação, Pilha de confirmação e Tamanho.

  4. Clique no cabeçalho da coluna Tamanho para que os resultados sejam classificados em ordem decrescente. A pilha de confirmação mostra o caminho de código que leva à memória que está sendo alocada. Esses resultados podem ajudar a entender o motivo da alocação. A classificação por tamanho permite que você se concentre nas alocações maiores e investigue se há uma oportunidade de otimização.

  5. Filtre para o(s) processo(s) que você está interessado em analisar clicando com o botão direito do mouse no processo e selecionando Filtrar a seleção.

  6. Para ampliar a região de interesse no visor, selecione um intervalo, clique com o botão direito do mouse no gráfico e selecione Aplicar zoom.

  7. Navegue pela pilha de confirmação para entender quais funções têm memória alocada. As pilhas de confirmação precisarão de símbolos carregados. Para carregar símbolos, selecione Rastrear>símbolos de carregamento na barra de menu de navegação superior.

    Captura de tela do rastreamento de memória do Windows Performance Analyzer

Aplicar a análise de rastreamento para reduzir o uso de memória

Ao analisar a memória alocada, você encontrará pistas que ajudarão a decidir onde o uso de memória pode ser minimizado.

Algumas áreas a serem consideradas em relação à aplicação da análise de rastreamento para atualizar o código para reduzir o uso de memória incluem:

  • Reduzir o uso de memória quando em primeiro plano: Analisar o rastreamento de memória pode ajudar você a identificar qualquer uso de memória desnecessário em primeiro plano e atualizar seu código para reduzir ou remover esse uso.

  • Minimizar o trabalho em segundo plano: o sistema tem políticas para envelhecer páginas dos conjuntos de trabalho do processo. Usar menos memória em segundo plano permite que o sistema seja mais eficiente, mantendo menos memória residente do aplicativo. Saiba mais sobre como Melhorar o consumo de energia e a vida útil da bateria minimizando o trabalho em segundo plano, o que também se traduzirá em usar menos memória em segundo plano.

  • Liberar recursos em segundo plano: em runtime, um aplicativo pode criar alguns caches de memória, bem como criar alocações de elementos gráficos para oferecer suporte à sua interface do usuário. Essas alocações podem ser liberadas quando o aplicativo é minimizado ou não está visível. Um aplicativo pode se registrar para notificações de pouca memória para executar tal ação, mas uma estratégia melhor pode ser liberar memória após um período sem ser usado, quando o aplicativo conclui que está inativo. Esse período de desuso pode variar de acordo com a aplicação, de modo que possíveis indicadores de uso inativo podem variar de um punhado de minutos a ½ hora ou mais. Deve-se tomar cuidado para equilibrar esse tipo de economia de memória com a capacidade de resposta. Se um cache for caro para reconstruir, o aplicativo poderá optar por retê-lo durante a vida útil do aplicativo.

  • Verificar se o aplicativo não vaza memória: para verificar se há vazamentos de memória, primeiro estabeleça um parâmetro de comparação de estado estacionário, onde o uso de memória do aplicativo se estabiliza ou não aumenta além de um determinado valor. É possível estabelecer esse estado estacionário usando continuamente o aplicativo ou deixando-o ocioso na tela de fundo. Usar o rastreamento que você capturou para identificar um possível vazamento de memória, é possível encontrar onde essa memória está sendo alocada em seu código e como ela pode ser liberada de uso depois de ter servido ao seu propósito. Se a memória continuar a aumentar à medida que o aplicativo está sendo executado, isso é uma indicação provável de um vazamento de memória. Coloque mais zoom na região correspondente ao aumento dentro do rastreamento e analise cuidadosamente as pilhas de confirmação.

Usar o espaço em disco com eficiência

O volume do disco refere-se ao tamanho de um aplicativo quando ele é armazenado em um estado inativo (não executando código). Se o aplicativo ocupar muito volume de disco, poderá ser uma oportunidade de otimização.

Há várias maneiras de reduzir o volume do disco do aplicativo para melhorar o desempenho:

  • À medida que um disco fica cheio, o sistema de arquivos não pode mais armazenar novo conteúdo de forma contígua. Um disco completo torna-se fragmentado, armazenando novo conteúdo em setores não contíguos. Isso se traduz em maior tempo de latência quando esse conteúdo é acessado a partir do disco. Os sistemas de E/S fornecerão uma taxa de transferência de disco muito melhor quando o conteúdo for contíguo e puder ser acessado sequencialmente ou usando E/S maiores.

  • Um disco cheio pode se traduzir em latências de gravação mais longas para sistemas baseados em SSD. Quando há menos células vazias para absorver gravações, uma gravação pode incorrer em uma operação de leitura-modificação-gravação, diminuindo o desempenho.

  • Um disco cheio pode dificultar a capacidade de atualizar o aplicativo. Embora o sistema operacional seja resiliente e capaz de manter o sistema atualizado e seguro, mesmo com pouco espaço disponível em disco, uma quantidade saudável de espaço em disco disponível para preparar o conteúdo para a atualização de aplicativo se traduzirá em uma experiência de atualização mais rápida e suave.

  • Exigir que uma quantidade significativa de um grande volume de disco seja acessado em tempo de execução também se traduzirá em uso de memória. Isso afetará a capacidade de resposta do aplicativo e do sistema em geral. Além disso, se uma pequena proporção do espaço ocupado pelo disco for necessária em tempo de execução, o aplicativo poderá estar usando o espaço em disco de forma ineficiente.

Algumas maneiras de reduzir ou ser mais eficiente com o espaço em disco incluem:

  • Aplicar os princípios de "pagar pelo uso" ao volume de disco (baixe apenas o que você precisa): um aplicativo pode incluir uma ampla gama de recursos, com nem todos os recursos se aplicando a todos os usuários. Essa pode ser uma das razões para um grande volume de disco. Ao aplicar os princípios de "pagar pelo uso", é possível pedir aos usuários que selecionem apenas para baixar os recursos de que precisam, traduzindo-se em um volume de disco menor quando baixarem o aplicativo. O conteúdo adicional é tornado opcional para download somente quando o usuário precisa de recursos mais avançados. Além dos recursos, é possível aplicar os mesmos princípios de "pagar pelo uso" ao suporte a idiomas. O aplicativo pode incluir um subconjunto de opções de idioma populares por padrão, com idiomas adicionais opcionalmente incluídos ou dependentes do local definido no sistema do usuário.

  • Aplicar dimensionamento de cache eficiente: em alguns casos, um aplicativo pode usar caches em disco para tornar a experiência do usuário mais responsiva. As políticas podem ser definidas para como o aplicativo gerencia o cache, com um limite superior definido no tamanho do cache com base na capacidade do disco e redimensionando o cache quando o espaço disponível no disco é baixo.

  • Aplicar o uso eficiente de ativos: um aplicativo geralmente inclui ativos de imagem e pode consistir em um intervalo de tamanho de imagem para oferecer suporte a várias resoluções. A otimização do tamanho, das dimensões, do formato e da compactação da imagem para um subconjunto de resoluções e o aproveitamento do dimensionamento para oferecer suporte às resoluções restantes podem reduzir significativamente o volume do disco.

  • Investigar oportunidades de otimização binária: ferramentas, como SizeBench, permitem que os autores de aplicativos investiguem o que contribui para o volume binário e encontrem oportunidades para reduzir a quantidade de espaço em disco usado.

Recursos adicionais