Partilhar via


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

Este guia demonstrará como melhorar o desempenho do seu aplicativo do 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

A fim de minimizar adequadamente o uso da memória, primeiro é importante entender:

Depois de ter um rastreamento do sistema para analisar, recomendaremos orientações para Aplicando 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 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 melhor desempenho, 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 são residentes 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 apoiada por arquivo. O uso de memória com base em ficheiros vem de binários e ficheiros de dados, como bases de dados, usados por uma aplicação. Isso geralmente não é uma parte significativa do uso de memória de um aplicativo e, muitas vezes, uma constante. (As exceções seriam as aplicações de tratamento de dados, a compilação de códigos, 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 com suporte de arquivo, que persiste nas 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 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 independente 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 da memória

A atividade de gravação 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 ajudar a identificar como melhorar o desempenho da sua aplicação.

Os vestígios podem variar em comprimento:

  • Um breve rastreamento de execução pode ser usado para capturar a inicialização de um aplicativo. Isso pode incluir a transição do seu aplicativo para o estado inativo, onde 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, geralmente com 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.

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

Para os fins deste artigo, vamos nos concentrar no uso do Analisador de Desempenho do Windows. Para saber mais sobre como escolher uma ferramenta para criar o perfil do desempenho do seu aplicativo, consulte Escolhendo entre o Visual Studio Performance Profiler, o Kit de Ferramentas de Desempenho do Windows e o PerfView.

Para capturar um rastreamento:

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

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

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

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

Analise o rastreamento do sistema

Para encontrar quais das funções do seu aplicativo alocaram memória que você pode reduzir, agora você precisa analisar o rastreamento do 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 Graph Explorer, expanda a seção Memory, clique com o botão direito do mouse no gráfico Total Commit e selecione Adicionar gráfico à nova vista de análise.

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

  4. Clique no cabeçalho da coluna Tamanho para que os resultados sejam ordenados por ordem decrescente. O Commit Stack mostra a trajetória do código que leva à alocação de memória. Estes resultados podem ajudar a compreender a razão da atribuiçã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 o(s) processo(s) 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 a sua região de interesse na janela de visualização, selecione um intervalo, clique com o botão direito do rato no gráfico e selecione Zoom.

  7. Navegue pelo Commit Stack para entender quais funções alocaram memória. As stacks de commit necessitarão símbolos a ser carregados. Para carregar símbolos, selecione Rastrear>Carregar símbolos na barra de menus 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 considerar em relação à aplicação da análise de rastreamento para atualizar seu 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 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.

  • Minimizar o trabalho em segundo plano: O sistema tem políticas para remover gradualmente páginas dos conjuntos de trabalho do processo. Usar menos memória em segundo plano permite que o sistema seja mais eficiente, mantendo menos da memória do aplicativo residente. 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 uso de memória em segundo plano.

  • Libertar recursos em segundo plano: No tempo de execução, uma aplicação pode criar alguns caches de memória, bem como criar alocações gráficas para dar suporte à sua interface de utilizador. Essas alocações podem ser liberadas quando o aplicativo é minimizado ou não 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 de não ser usado, quando o aplicativo conclui que está inativo. Este período de desuso pode variar de acordo com a aplicação, de modo que os possíveis indicadores de uso inativo podem variar de um punhado de minutos a 1/2 hora ou mais. Deve-se ter cuidado para equilibrar esse tipo de economia de memória com a capacidade de resposta. Se a reconstrução de um cache for caro, o aplicativo poderá optar por retê-lo durante o tempo de vida do aplicativo.

  • Certifique-se de que seu aplicativo não vaze memória: para verificar se há vazamentos de memória, primeiro estabeleça uma referência de estado estacionário, onde o uso de memória do aplicativo estabilize ou não cresça além de um determinado valor. Você pode estabelecer esse estado estacionário usando continuamente o aplicativo ou deixando-o ocioso em segundo plano. Usando o rastreamento capturado para identificar um possível vazamento de memória, você pode descobrir onde essa memória está sendo alocada em seu código e como ela pode ser liberada de uso depois de cumprir seu propósito. Se a memória continuar a crescer à medida que o aplicativo está sendo executado, isso é uma indicação provável de um vazamento de memória. Aumente o zoom para a região correspondente ao crescimento dentro do seu rastreamento e analise cuidadosamente as pilhas de confirmação.

Utilize o espaço em disco de forma eficiente

Disk footprint refere-se ao tamanho de um aplicativo quando ele é armazenado em um estado inativo (não executando código). Se o aplicativo ocupa muito espaço ocupado pelo disco, pode ser uma oportunidade para otimizar.

Há várias maneiras de reduzir o espaço ocupado pelo disco do seu aplicativo para melhorar o desempenho:

  • À medida que um disco fica cheio, o sistema de arquivos não pode mais armazenar conteúdo novo 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 completo pode traduzir-se em latências de escrita 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 seu 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 do seu aplicativo se traduzirá em uma experiência de atualização mais rápida e suave.

  • Exigir uma quantidade significativa de um grande espaço de disco para ser acessado em tempo de execução também se traduzirá em uso de memória. Isso afetará a capacidade de resposta do seu 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 pode estar usando espaço em disco de forma ineficiente.

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

  • Aplique os princípios de "pay-for-play" à sua área de disco (transfira apenas o que precisa): Uma aplicação pode incluir uma vasta gama de funcionalidades com nem todas as funcionalidades se aplicam a todos os utilizadores. Esta pode ser uma das razões para uma grande ocupação de espaço no disco. Ao aplicar os princípios de "pagar para usar", pode pedir aos utilizadores que selecionem apenas as funcionalidades que desejam transferir, resultando numa menor utilização de espaço em disco quando transferem a sua aplicação. O conteúdo adicional torna-se opcional para download apenas quando o usuário tem a necessidade de recursos mais ricos. Além dos recursos, você pode aplicar os mesmos princípios de "pagamento por jogo" 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 dependendo do local definido no sistema do usuário.

  • Aplicarde 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 é baixo.

  • Aplique o uso eficiente de ativos: um aplicativo geralmente inclui ativos de imagem e pode consistir em uma variedade de tamanhos de imagem para suportar várias resoluções. Otimizar o tamanho, as dimensões, o formato e a compactação da imagem para um subconjunto de resoluções e aproveitar o dimensionamento para dar suporte às resoluções restantes pode reduzir significativamente o espaço ocupado pelo disco.

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

Recursos adicionais