Otimização de desempenho do WinUI 3

Este tópico descreve como utilizar ferramentas de monitorização de desempenho do Windows Performance Toolkit para produzir perfis de desempenho aprofundados para aplicações WinUI.

Como uso o Windows Performance Recorder para monitorizar aplicações do WinUI?

O Windows Performance Recorder (WPR) pode ser usado para criar gravações detalhadas de Event Tracing for Windows (ETW) sobre o comportamento do sistema, o comportamento das aplicações e o uso de recursos, com base em perfis incorporados. Estas gravações ETW podem então ser processadas pelo Windows Performance Analyzer (WPA) para produzir um conjunto de gráficos e tabelas para um consumo mais fácil e análise aprofundada do uso da CPU, problemas de energia, fraco desempenho do sistema ou da aplicação e outras questões de desempenho.

Observação

Embora existam versões GUI e linha de comando do WPR, este tópico refere-se apenas à versão GUI (consulte Introdução ao WPR para obter mais detalhes sobre ambas as versões).

Perfis WPR

Os perfis WPR são usados para coletar informações sobre vários aspetos e comportamentos do seu aplicativo.

Na imagem a seguir, a janela do Gravador de Desempenho do Windows é mostrada com o perfil "Uso da CPU" (utilização da CPU para cada CPU no sistema) e o perfil "Atividade XAML" (eventos de provedores relacionados a XAML, como WinUI) selecionados.

Captura de ecrã do Windows Performance Recorder com utilização do CPU e perfis de atividade XAML selecionados.

Como faço para usar o Analisador de Desempenho do Windows com aplicativos WinUI?

WinUI é uma API declarativa, de modo persistente, onde o aplicativo descreve uma árvore de UIElements e o WinUI executa o layout e a renderiza. Isso é feito no thread da interface do usuário em lotes chamados "quadros", que devem ser concluídos rapidamente, idealmente dentro de um intervalo de atualização da exibição. Quando os quadros são longos, isso não apenas atrasa a chegada das atualizações à tela, mas também impede que o thread da interface do usuário manipule a entrada. Quadros lentos, embora não sejam a única razão para problemas de capacidade de resposta, são um dos mais comuns.

Instale o plug-in "Análise de quadros XAML"

WinUI registra eventos ETW que rastreiam o início e a parada de cada quadro (mostrado na captura de tela a seguir da tabela WPA "Eventos genéricos"). No entanto, como a duração de cada quadro precisa ser calculada manualmente, é difícil identificar ocorrências de quadros lentos.

Captura de ecrã do Windows Performance Analyzer mostrando a tabela de Eventos Genéricos com uma série de início e paragem de frames.

Para resolver este problema, um novo plugin de tabela "XAML Frame Analysis" está incluído com o Windows Assessment Toolkit (ADK) 10.1.26100.1 e posteriores. Esta tabela calcula e mostra a duração de cada quadro (juntamente com outras operações demoradas).

Observação

A tabela "XAML Frame Analysis" requer o Windows Performance Analyzer (WPA) do Windows ADK 10.1.26100.1 ou posterior. A versão do WPR usada para recolher o rastro não importa.

Uma vez instalado o ADK, a tabela "XAML Frame Analysis" deve ser ativada editando o ficheiro de configuração "perfcore.ini" na pasta WPA (tipicamente, C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit). Para fazer isso, feche todas as instâncias abertas do WPA, abra "perfcore.ini" em um editor de texto, adicione perf_xaml.dll à lista de dlls e salve e feche o arquivo. Reinicie o WPA, que agora deve mostrar o gráfico "Análise de quadros XAML" na parte inferior da seção Atividade do sistema.

Captura de tela do Analisador de Desempenho do Windows mostrando a tabela Análise de Quadros XAML na parte inferior da seção Atividade do Sistema.

Utilize o plugin "Análise de Quadros XAML"

A Análise de Quadros Xaml oferece suporte a dois modos de exibição (ambos os modos de exibição mostram as mesmas colunas):

  • "Quadros Xaml interessantes" (padrão) - Mostra quadros WinUI com base em heurísticas que identificam aqueles com maior probabilidade de causar problemas de responsividade. Estas regiões correspondem a aquelas que começam com operações como inicialização do WinUI, navegação de frames ou exibição de flyout e param com o final do próximo frame. Esses cenários geralmente envolvem alterações extensas na árvore UIElement e são os mais suscetíveis a problemas de desempenho.
  • "All Xaml Info" - Mostra todos os frames WinUI de todos os processos encontrados no rastreio. Para operações como um quadro ou um passo de layout, o plug-in calcula e exibe automaticamente as durações com base nos eventos Start e Stop.

A captura de tela a seguir destaca como alternar entre modos de exibição de Análise de Quadros Xaml.

Captura de tela do Analisador de Desempenho do Windows mostrando os seletores de exibição para a tabela Análise de Quadros Xaml.

Ambos os modos de exibição de Análise de Quadro Xaml incluem as seguintes colunas:

Título Value
Processo Nome e ID do processo
Identificador de Thread Identificador de Thread
Tipo Descreve o evento correspondente à linha. Os valores possíveis incluem:
  • WXM::InitializeForCurrentThread - Uma chamada para WindowsXamlManager.InitializeForCurrentThread. Inicializa o WinUI na thread.
  • DWXS::Initialize - Uma chamada para DesktopWindowXamlSource.Initialize. Inicializa uma ilha WinUI.
  • Quadro - Um quadro no thread da interface do usuário. Executa o layout e renderiza as alterações na árvore desde o quadro anterior.
  • Criar dispositivo gráfico - Crie um dispositivo D3D e um dispositivo D2D para WinUI. Ocorre em um thread em segundo plano.
  • UpdateLayout - Uma passagem de layout no thread da interface do usuário. Ocorre como parte de um quadro, mas também pode ser acionado pelo aplicativo por meio de UIElement.UpdateLayout.
  • Frame::Navigating - WinUI gera o evento Frame.Navigating .
  • Frame::Navigated - WinUI gera o evento Frame.Navigated .
  • Hwnd Focus - O hwnd ativo mudou.
  • Região de Interesse - Uma região calculada pelo plugin para cenários interessantes. Inicia após eventos como inicialização do WinUI, navegação de quadros e abertura de menus. Termina no final do próximo quadro.
ÉInteressante Se a fila é considerada interessante. Apenas linhas relevantes aparecem na vista Quadros XAML Interessantes.
Duração (ms) A duração da linha. Calculado a partir dos eventos Start e Stop.
Peso (ms) O tempo de execução real da CPU correspondente ao período de tempo.
Início(s) A hora do evento de Início
Paragem(ões) A hora do evento Stop

As colunas podem ser classificadas por Tipo ou Duração para ajudar a identificar possíveis problemas, como os frames mais caros e com maior duração no traço (consulte a imagem a seguir). Você também pode aprofundar-se em linhas individuais para identificar as operações dispendiosas e as potenciais otimizações.

Captura de ecrã do Analisador de Desempenho do Windows mostrando a tabela de todas as informações do XAML, ordenada por duração (ms).