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:
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.
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:
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:
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.
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.
É 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.
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.
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!