⏱ Otimizando o tempo de Build do projeto em Swift

Conrado Carneiro
Usemobile
Published in
4 min readFeb 8, 2017

--

Otimizando o código para tratar problemas no compilador do XCode.

Recentemente um código ficou famoso nas listas de discussões, onde uma simples declaração de objeto em Swift 2.2 levava horas para ser compilada.

O motivo?

O compilador apresentava sérios problemas para inferir o tipo do objeto automaticamente.

Compilando e executando um simples projeto como ocódigo a seguir, em Swift 2.2, deixa o seu compilador louco. Ao inferir o tipo dos objetos pertencentes aos dicionários e array proporcionaria um problema grave, ocasionando dolorosos minutos de compilação, o que parece um absurdo para um simples código. Agora imagine o que códigos como esse, espalhados por um projeto poderia proporcionar: horas, talvez dias de compilação. 😤

Este é um problema de inferência de tipo. O compilador Swift do XCode não consegue definir com presição qual tipo é mais adequado, então ele tem que analisar varias possibilidades antes de continuar a compilar o restante do código. Acontece um comportamento peculiar, que ao adicionar mais objetos ao mesmo Array, aumenta o tempo de compilação exponencialmente. Na prática, o Swift está fazendo a coisa certa: verificando qual tipo de objeto você deveria ter declarado. 😏

Acontece que a inferência de tipos é a principal vantagem anunciada pela Apple ao lançar o Swift, então não devemos parar de utiliza-la. Em vez disso, devemos identificar as situações onde esse problema acontece (por mais inesperado que isso possa ser) e auxiliar o compilador a determinar o tipo do objeto em um tempo plausível, ou seja, rápido! A solução a longo prazo, depende do time de desenvolvedores do compilador swift.. 🤣

Se você suspeitar que um projeto em Swift está levando muito tempo para compilar, você deve ativar a opção debug-time-function-bodies nas configurações do projeto.

Habilitando o debug-time-function-bodies no XCode:

Nas configurações do seu projeto, vá na aba Build Settings e em seguida marque a opção All.

Build Settings

Dentro do Item Swift Compiler — Custom Flags, temos a opção Other Swift Flags, basta declarar a seguinte configuração: -Xfrontend -debug-time-function-bodies conforme mostrado na image.

Other Swift Flags

Agora o Swift irá mostrar o tempo gasto para compilar cada função. Faça um novo Build do seu projeto (⌘B) e em seguida veja os resultados no Build Report (⌘8)

Build Report

Em seguida, clique com o botão direito do mouse no log de compilação e selecione Expand All Transcripts.

Expandir todas as transcrições para ver o log de compilação detalhado.

Finalmente, você verá uma série de itens com um simbolo de check verde. Ao clicar em cada um deles será exibido o log, que representa cada arquivo ou etapa no processo de compilação do XCode. Caso tenha configurado corretamente o sinalizadores para compilação, você verá uma linha a esquerda com os tempos gastos para compilar cada etapa ou arquivo. Você pode analisar esses tempos, para investigar onde no código está consumindo mais tempo. Qualquer situação superior a cem milissegundos deve ser investigada.

Podemos notar uma linha com 634.8 ms no tempo de compilação da função ViewDidLoad no arquivo ViewController.swift. Agora que sabemos que a inferência de tipos pode ser um problema, fica bem mais fácil identificar os problemas no projeto. Especificar informações de tipo do objeto e realizar o build novamente. No exemplo apresentado no inicio do artigo, definir os tipos da estrutura como Dictionary <String, AnyObject> é suficiente para reduzir o tempo de 634ms para 20ms. Problema resolvido!

Agora ficou mais fácil.

Defina o tipo dos objetos em situações onde o compilador não consegue inferir com rapidez e isso irá otimizar visivelmente o tempo de compilação do seu projeto, resultando numa maior produtividade uma vez que você irá aguardar bem menos para o projeto compilar.

ATUALIZADO:

Confira o artigo Luta contra XCode 🥊 com algumas dicas fundamentais para reduzir o tempo de build do projeto.

--

--

Conrado Carneiro
Usemobile

iOS developer, desenvolvo projetos na área de computação móvel, iBeacon, watch, apple Tv.