Compartilhar via


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

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

Minimizar o uso de memória

Há várias maneiras de minimizar a quantidade de memória que seu aplicativo do Windows usa, você pode:

  • Reduzir o uso de memória em primeiro plano
  • Minimizar o trabalho em segundo plano
  • Liberar recursos em segundo plano
  • Certifique-se de que seu aplicativo não vaze memória

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

Depois que você tiver um rastreamento do sistema para analisar, recomendaremos diretrizes para aplicar sua 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 reside na memória – é uma medida do uso da memória do aplicativo.

A quantidade de memória que um aplicativo usa afeta seu desempenho de runtime, bem como a capacidade de resposta do sistema como um todo. Minimizar o uso de memória ajudará o aplicativo a ter um melhor desempenho, reduzindo os custos de CPU associados ao acesso a mais memória. O menor uso de memória também ajuda com a capacidade de resposta do sistema e a experiência do usuário do aplicativo em geral, pois o aplicativo não acaba deslocando outro conteúdo 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 removerá o conteúdo usado anteriormente. Quando o usuário voltar para o shell ou outro aplicativo, e os dados necessários não estiverem residentes na memória, os dados precisarão ser lidos do disco. O usuário provavelmente observará uma desaceleração devido a esse processo.

Há duas partes-chave na memória usadas por um aplicativo: 1) memória dinâmica e 2) memória com backup de arquivo. O uso de memória com suporte de arquivo vem de binários e arquivos de dados, como bancos de dados, usados por um aplicativo. Normalmente, essa não é uma parte significativa do uso de memória de um aplicativo e, muitas vezes, uma constante. (Exceções seriam aplicativos de processamento de dados, compilação de código etc.) A fonte mais significativa de uso de memória, 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 com suporte de arquivo, que persiste entre reinicializações do sistema, a memória dinâmica só existe durante o tempo de vida 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) lidam com solicitações de alocação de memória de um aplicativo do Windows independentemente da rotina de 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 compreender o uso de memória da aplicação e encontrar oportunidades de melhoria, recomendamos capturar um rastreamento de alocação virtual, conforme descrito abaixo.

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

A gravação da atividade do dispositivo durante um período de tempo é conhecida como rastreamento do sistema. O rastreamento do sistema produz um arquivo de rastreamento que pode ser usado para gerar um relatório e ajudá-lo a identificar como melhorar o desempenho do aplicativo.

Os rastros podem variar de tamanho:

  • 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.
  • Rastreamento contínuo, geralmente com duração de vários minutos, é útil para diagnosticar vazamentos de memória. Se o uso de memória continuar a aumentar ao longo do tempo, isso geralmente é sugestivo de um vazamento.

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

Para fins deste artigo, nos concentraremos no uso do Analisador de Desempenho do Windows. Para saber mais sobre como escolher uma ferramenta para criação de perfil do desempenho do aplicativo, consulte Escolhendo entre o Criador de Perfil de Desempenho do Visual Studio, o Windows Performance Toolkit e o PerfView.

Para capturar um traço:

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

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

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

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

Analisar o rastreamento do sistema

Para identificar quais funções do seu aplicativo alocaram memória que você pode reduzir, é necessário agora analisar o rastreamento de sistema que foi capturado. Para analisar o traço:

  1. Abra o rastreamento usando o Analisador de Desempenho do Windows inserindo o comando: wpa.exe Trace.etl

  2. Na janela do Explorador de Gráficos, expanda a seção Memória, clique com o botão direito do mouse no Gráfico de Commit Total e selecione Adicionar gráfico à Nova Visualizaçã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 Commit Stack mostra o caminho do código que leva à alocação da memória. 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 otimizar.

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

  6. Para ampliar sua região de interesse no visor, selecione um intervalo, clique com o botão direito do mouse no grafo e selecione Zoom.

  7. Navegue pela Commit Stack para entender quais funções alocaram memória. As pilhas de confirmação precisarão de símbolos carregados. Para carregar símbolos, selecione Rastreamento>Carregar símbolos na barra de menu de navegação superior.

    Captura de tela de rastreamento de memória do Analisador de Desempenho do Windows

Aplicando sua análise de rastreamento para reduzir o uso de memória

Ao analisar a memória alocada, você encontrará pistas para ajudá-lo a decidir onde o uso de memória pode ser minimizado.

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

  • Reduzir o uso de memória quando estiver em primeiro plano: analisar o rastreamento de memória pode ajudá-lo a identificar qualquer uso desnecessário de memória em primeiro plano e atualizar seu código para reduzir ou remover esse uso.

  • Reduzindo o trabalho enquanto está em segundo plano: O sistema tem políticas para eliminar gradualmente páginas dos conjuntos de trabalho do processo. Usar menos memória em segundo plano permite que o sistema seja mais eficiente ao manter menos memória do aplicativo presente. Saiba mais sobre como melhorar o consumo de energia e a duração da bateria minimizando o trabalho em segundo plano, que também se traduzirá em usar menos uso de memória enquanto estiver em segundo plano.

  • Liberar recursos em segundo plano: em tempo de execução, um aplicativo pode criar alguns caches de memória, bem como criar alocações gráficas para dar suporte à 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 baixa memória para executar essa ação, mas uma estratégia melhor pode ser liberar memória após um período de não uso, quando o aplicativo conclui que ele está inativo. Esse período de desutilização pode variar de acordo com o aplicativo, de modo que possíveis indicadores de uso inativo podem variar de um punhado de minutos a 1/2 hora ou mais. Deve-se tomar cuidado para equilibrar esse tipo de economia de memória com capacidade de resposta. Se um cache for caro para recompilar, o aplicativo poderá optar por mantê-lo durante o tempo de vida do aplicativo.

  • Verifique se o aplicativo não vazou memória: para verificar se há vazamentos de memória, primeiro estabeleça um parâmetro de comparação de estado estável, em que o uso da memória do aplicativo se nivela ou não cresce além de um determinado valor. Você pode estabelecer esse estado estável usando continuamente o aplicativo ou deixando-o ocioso em segundo plano. Usando o rastreamento que você capturou para identificar um possível vazamento de memória, você pode encontrar onde essa memória está sendo alocada em seu código e como ela pode ser liberada de uso depois de ter servido a sua finalidade. Se a memória continuar a crescer à medida que o aplicativo estiver em execução, essa será uma indicação provável de um vazamento de memória. Amplie para a região que corresponde ao crescimento no seu rastreamento e analise cuidadosamente as commit stacks.

Usar espaço em disco com eficiência

O volume de disco refere-se ao tamanho de um aplicativo quando ele é armazenado em um estado inativo (não executando código). Se o aplicativo ocupa muito volume de disco, pode ser uma oportunidade de otimizar.

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

  • À medida que um disco fica cheio, o sistema de arquivos não pode mais armazenar novos conteúdos de forma contígua. Um disco completo se torna fragmentado, armazenando novo conteúdo em setores não contíguos. Isso se traduz em tempo de latência mais longo quando esse conteúdo é acessado 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 puderem ser acessados sequencialmente ou usando IOs maiores.

  • Um disco completo 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 completo pode dificultar a capacidade de atualizar seu aplicativo. Embora o sistema operacional seja resiliente e possa manter o sistema atualizado e seguro, mesmo com pouco espaço disponível em disco, uma quantidade íntegra de espaço em disco disponível para preparar o conteúdo da atualização do aplicativo se traduzirá em uma experiência de atualização mais rápida e suave.

  • Exigir uma quantidade significativa de espaço em disco grande a ser acessado em tempo de execução também será traduzido para 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 volume de disco for necessária em tempo de execução, o aplicativo poderá estar usando espaço em disco ineficiente.

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

  • Aplique princípios de "pay-for-play" ao volume de disco (baixe apenas o que você precisa): um aplicativo pode incluir uma ampla gama de recursos, e nem todos os recursos são aplicáveis a todos os usuários. Isso pode ser um motivo para um grande espaço em disco. Aplicando princípios de "pay-for-play", você pode pedir aos usuários que selecionem apenas para baixar os recursos necessários, traduzindo para um volume de disco menor quando baixarem seu aplicativo. O conteúdo adicional é opcional para download somente quando o usuário precisa de recursos mais avançados. Além dos recursos, você pode aplicar os mesmos princípios de "pagamento por jogo" ao suporte à linguagem. O aplicativo pode incluir um subconjunto de opções de idioma popular por padrão, com idiomas adicionais opcionalmente incluídos ou dependentes do local definido no sistema do usuário.

  • Aplicar um 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 seu 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 for baixo.

  • Aplicar o uso eficiente de ativos: um aplicativo geralmente incluirá ativos de imagem e pode consistir em um intervalo de tamanho de imagem para dar suporte a várias resoluções. Otimizar o tamanho, dimensões, formato e compactação da imagem para um subconjunto de resoluções e aproveitar o dimensionamento para dar suporte a resoluções restantes pode reduzir significativamente o volume de 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 usada.

Recursos adicionais