Articles

O uso de Xcode Instruments para melhorar o desempenho do aplicativo

Xcode Instruments é uma ferramenta de desenvolvimento que vem gratuitamente com Xcode. Tem muitas ferramentas úteis para inspecionar e melhorar o seu aplicativo. Embora tenha muito a oferecer, muitas vezes é uma área um pouco menos conhecida.

Neste post do blog, vou mostrar como melhorei a performance em uma parte crucial do aplicativo Collect by WeTransfer, usando Xcode Instruments. Para dar uma idéia dos resultados, este é o resultado antes e depois no qual a parte após “Importar fotos” foi drasticamente melhorada:

ViRE – Visual Regular Expressions (Mac & iPad)ViRE é uma ferramenta de Visual Regular Expressions: Regex legível – Código Completo / Folha de Cópias – Testes unitários – Sistema de Substituição Poderoso – Pesquisa Passo a Passo & Substituir – Esquema Visual Regex – Histórico Regex / Playground. ViRE está disponível em Mac & iPad.

Como pode ver, o popup de importação mostra muito mais tempo na versão antiga enquanto a folha de partilha final também está a ser muito atrasada.

Quanto melhor for esta parte na sua aplicação, melhor será a sua aplicação.

Tempo para mergulhar e ver como melhoramos este fluxo!

O que é Xcode Instruments?

Xcode Instruments é melhor descrito como uma poderosa e flexível ferramenta de análise de desempenho e teste. Faz parte do conjunto de ferramentas Xcode que também inclui ferramentas como o Create ML e o Accessibility Inspector de Acessibilidade.

Os instrumentos podem ser usados para:

  • Track down problems in your source code
  • Analisar a performance do seu aplicativo
  • Localizar problemas de memória

E muito mais!

Como posso acessar os instrumentos Xcode?

Você pode acessar os instrumentos usando Product ➔ Profile do menu Xcode para o qual a alça de atalho é ⌘ + I. Isto irá reconstruir o seu produto e abrir a visão geral do Xcode Instruments.

Xcode Instruments Overview
Xcode Instruments Overview

Devo saber como usar cada instrumento?

Uma visão geral que mostra 17 instrumentos diferentes pode ser bastante avassaladora. Cada um deles pode ser muito valioso, mas definitivamente não são necessários para cada aplicação. Alguns deles, como o instrumento Game Performance, só são valiosos se você estiver desenvolvendo jogos.

Vale a pena mergulhar nos instrumentos disponíveis e saber quais deles estão disponíveis. Você pode acabar em um problema que pode ser perfeitamente resolvido por um dos instrumentos disponíveis.

Posso usar instrumentos no simulador?

Embora a maioria dos instrumentos possam ser executados no simulador, nem sempre é recomendável fazê-lo. Um dispositivo físico irá mostrar resultados mais realistas e é portanto recomendado para ser usado.

Usando o perfil de tempo dos instrumentos Xcode para investigar e melhorar o desempenho

O instrumento Profiler Time Profiler dá uma visão sobre as CPUs do sistema e como múltiplos núcleos e roscas são usados eficazmente. Quanto melhor for essa parte do seu aplicativo, melhor será o desempenho do aplicativo.

No exemplo de desempenho do aplicativo Collect, tínhamos o objetivo de acelerar o fluxo de adição de conteúdo ao nosso aplicativo. O Time Profiler é nosso ponto de partida para obter insights em qual parte do código pode ser otimizada.

Criando uma nova gravação usando o instrumento Time Profiler

Após selecionar o instrumento Time Profiler podemos iniciar uma nova gravação pressionando o botão vermelho no canto superior esquerdo ou usando ⌘ + R. Isto irá lançar a sua aplicação no dispositivo seleccionado, após o qual poderá iniciar o seu fluxo.

Após ter terminado o fluxo que pretende melhorar, pode parar a gravação e mergulhar nos resultados. Primeiro queremos saber como a linha principal é usada. A IU é bloqueada quando há muito trabalho acontecendo na thread principal, que é exatamente o problema que estamos experimentando em nosso aplicativo Collect.

Usando filtros para criar uma visão geral das threads

A barra de filtros pode ser usada para estreitar a visão geral e obter uma melhor percepção das threads usadas, selecionando a aba Threads. A rolagem para baixo mostra que nossa thread principal é muito usada enquanto as outras threads não estão tão ocupadas:

Time Profiler main thread usage insights in Xcode Instruments
O uso da thread principal do Time Profiler

Identificando qual parte do código pode ser otimizada

O uso de ⌘ + D abrirá a área de Detalhe se ela ainda não estiver visível. Isto mostra os nomes dos símbolos para o período destacado. No exemplo anterior, você pode ver que os picos no gráfico estão destacados em azul. Você pode fazer o mesmo clicando e arrastando na parte que você quer investigar.

No início, parece bastante inutilizável olhando os nomes dos símbolos na área de detalhe:

Unclear symbol names in the detail area
Nomes de símbolos pouco claros na área de detalhe

Embora o lado direito da área de detalhe nos mostre o Traço de Pilha mais pesado, podemos usar o filtro de entrada Call Tree para obter uma visão ainda melhor. Isto também irá melhorar a vista de rastreamento de pilha mais pesada, escondendo certos símbolos.

Hide system libraries in the detail area
Esconder bibliotecas do sistema na área de detalhe

Comecemos com as bibliotecas do sistema Hide system que irão tirar todos os símbolos de nível inferior que não estão em nosso controle e não podem ser otimizados por nós de qualquer maneira. Como você pode ver, a visão geral de Stack Trace mais pesado já está muito mais limpa agora.

Próximo é o filtro Invert Call Tree que tornará os métodos de nível superior visíveis sem a necessidade de clicar em cada árvore de chamada. Em combinação com a ordenação na coluna Peso, podemos ver exatamente quais métodos devem ser otimizados.

Time Profile input filters to narrow down the results
Filtros de entrada de Perfil de Tempo para restringir os resultados

É bastante claro que nosso código PHImageManager está executando o pior, pois leva 3,36 segundos do total de 11,16 segundos. Acontece que poderíamos mover isto para uma thread de fundo com bastante facilidade e descarregar a thread principal para esta parte.

Outra coisa que notamos é o BucketHeaderView que está recalculando sua altura o tempo todo embora não tenhamos feito nada com ele no fluxo que estamos testando. Acontece que realmente não tivemos que fazer isto.

Validando os resultados

Depois de ter melhorado o seu código é hora de executar novamente o Time Profiler e validar os resultados para ter certeza de que foi realmente melhorado.

Validating results in the time profiler
Validar os resultados no profiler de tempo

Embora já tenhamos visto as melhorias no antes e depois do vídeo compartilhado anteriormente, agora também podemos ver que o mesmo fluxo não contém mais o PHImageManager como o traço de pilha mais pesado. Isto confirma que nossa mudança de código funcionou.

O cabeçalho também não é mais recalculado e a performance do nosso fluxo foi melhorada.

ViRE – Visual Regular Expressions (Mac & iPad)ViRE é uma ferramenta de Visual Regular Expressions: Regex legível – Código Completo / Folha de Cópias – Testes unitários – Sistema de Substituição Poderoso – Pesquisa Passo a Passo & Substituir – Esquema Visual Regex – Histórico Regex / Playground. ViRE está disponível em Mac & iPad.

Conclusão

Xcode Instruments contém muitas ferramentas valiosas para melhorar o desempenho da sua aplicação. O Time Profiler pode ser usado para mergulhar em um determinado fluxo, melhorar um pedaço de código e validar logo após.

Passar algum tempo para mergulhar nos instrumentos disponíveis para que você saiba quais são úteis quando e começar a melhorar o seu aplicativo. Se você está interessado em melhorar, ainda mais, você pode querer ler o meu post no blog sobre como melhorar o seu desempenho de compilação também!