xcode - Compile Time Incrivelmente Lento




swift3 (6)

Atualização 1:

Eu criei um novo projeto sem executar a conversão do Swift 3 , importei meus arquivos do Swift 3 , mas o tempo de compilação continua o mesmo.

Atualização 2:

Experimentei SWIFT_WHOLE_MODULE_OPTIMIZATION = YES , mas assim que você faz alterações em mais de um arquivo, a compilação incremental falha e aciona uma nova compilação que dura mais de 4-5 minutos.

Atualização 3:

Eu agora reescrevi toda a minha base de código do Swift 3 para o Swift 2.3 . Não fez qualquer diferença, o problema está no compilador Xcode 8 .

Atualização 4:

Posso confirmar que desmarcando esses dois aliviará a dor por um tempo, o bug do Xcode 8 parece estar ligado a como ele verifica as dependências entre os arquivos.

Atualização 5:

Eu converti minha base de código para Swift 3 do Swift 2.3 desde que o Xcode 8.2 beta exige, o beta deve incluir uma correção para "O Xcode não irá reconstruir um alvo inteiro quando apenas pequenas mudanças ocorrerem. (28892475)". É triste dizer que eles não corrigiram o bug e meus tempos de compilação são exatamente os mesmos com o Xcode 8.2 Beta .

Postagem original:

Não tenho reputação suficiente para comentar, mas ainda queria compartilhar alguns recursos. Eu estive preso nesta miséria por dias, a atualização para o Swift 3 foi um desastre completo.

Eu estou usando isso para rastrear arquivos lentos, mesmo assim como você, isso não é problema meu. Algo mais no xcode está levando literalmente 4 minutos para concluir: https://github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

Eu também me certifiquei de que eu não tivesse nenhuma lazy vars ou closures lazy vars que o swift não gostasse. Não use o + operator ao concatenar strings, etc. veja isto .

Eu atualizarei esta resposta se encontrar algo, é quase impossível ser produtivo com o Swift 3 ATM.

Meu projeto consiste em ~ 350 arquivos Swift e ~ 40 dependências de cacau.

Assim que todo o projeto foi migrado para o Swift 3 , os tempos de construção foram INCRIVELMENTE lentos e demoraram um pouco mais de 3 minutos para compilar completamente.
Percebi que, se eu reconstruí-lo depois de não alterar nenhum arquivo, ele é compilado dentro de um período de tempo razoável. No entanto, se eu adicionar uma nova função, demora 3 minutos.
Cocoapods não parece estar causando o problema, uma vez que atrasa no estado Compiling Swift source files .

Eu segui this para investigar:

  1. Adicionado o -Xfrontend -debug-time-function-bodies ao meu Other Swift Flags nas configurações de criação do meu destino

  2. Construa o projeto

  3. Copiei isto em pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100 terminal e correu pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100 pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100

No entanto, não vi nada de interesse. O arquivo que levou mais tempo para compilar foi de apenas 250 ms. O próximo mais próximo foi de 100ms, mesmo que todos os 350 arquivos demorassem 250ms para compilar, isso seria apenas um total de 73 segundos, o que está muito longe das compilações de 3+ minutos que estou vendo.


O que poderia estar causando esses longos tempos de compilação?

Nunca foi tão lento antes de atualizar para o Xcode 8 e Swift 3 .


A concatenação de várias Strings também pode causar tempos de compilação crescentes, por exemplo, no meu caso, meus tempos de compilação são muito altos devido a essa linha:

let fecha = post.dia + " " + post.num_dia + " " + post.mes + " - " + post.hora

Quando eu mudei o código para isso, ele compila em segundos:

var fecha = post.dia!
fecha = fecha + " "
fecha = fecha + post.num_dia!
fecha = fecha + " "
fecha = fecha + post.mes!
fecha = fecha + " - "
fecha = fecha + post.hora!

Eu encontrei um par de estilos de codificação que levam muito tempo compilando no Swift (2.3, não testado em 3):

a += b 

Deveria estar

a = a + b

Também adicionando array juntos:

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c

Deveria estar

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d : [Int] = []
d.appendContentsOf(a)
d.appendContentsOf(b)
d.appendContentsOf(c)

A última otimização levou o tempo de compilação para um método de 9800ms a 5.5ms ...


Eu migrei um projeto Swift 2x de 17 arquivos para o Swift 3 e tive 28 avisos e 55 erros em todos os arquivos. O tempo de compilação foi de 4-5 minutos.

Desativando

Find Implicit Dependancies 

no esquema e

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

fez apenas pequenas melhorias.

Como acabei limpando os avisos e erros em cada arquivo, o tempo de compilação reduziu e está agora nos segundos. O IDE está de volta se comportando como deveria - detectando erros quase em tempo real e compilando rapidamente.

Em primeiro lugar, parece que o compilador está recompilando (ou pelo menos cruzando) cada arquivo com qualquer erro ou aviso - mesmo que você não tenha editado esse arquivo desde a última compilação.

Em segundo lugar, se houver muitos erros / avisos dependentes nos arquivos, o compilador afunilará e diminuirá a velocidade.


Também a string concatenation parece ser incrivelmente lenta no Swift3 / XCode8:

item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")

~ demorou 8-10 segundos para compilar

item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"

~ levou 1,6 segundos para compilar

item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();

~ levou 0,001 segundo para compilar


SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Versão do Xcode: 8.1 GM

Para adicionar escolha o seu destino, vá para Editor > Add Build Setting > Add User-Defined Setting e adicione as opções acima.

Meu tempo de compilação limpo caiu de 35 minutos (Ahem, desculpe-me) para 8 minutos com uma contagem de arquivos de projeto de 800.

Nota: Tentei isso no Xcode 8.0 primeiro, mas não funcionou.





swift3