Estou usando o Xcode 6 Beta 6.
Isso é algo que me incomoda há algum tempo agora, mas está chegando a um ponto em que dificilmente pode ser usado agora.
Meu projeto está começando a ter um tamanho decente de 65 arquivos Swift e alguns arquivos Objective-C em ponte (que realmente não são a causa do problema).
Parece que qualquer pequena modificação em qualquer arquivo Swift (como adicionar um espaço em branco simples em uma classe que mal é usada no aplicativo) fará com que todos os arquivos Swift do destino especificado sejam recompilados.
Após uma investigação mais profunda, descobri que o que está consumindo praticamente 100% do tempo do compilador é a CompileSwift
fase em que o Xcode executa o swiftc
comando em todos os arquivos Swift do seu destino.
Eu fiz algumas investigações adicionais e, se eu mantiver o aplicativo delegado apenas com um controlador padrão, a compilação é muito rápida, mas como eu estava adicionando mais e mais dos meus arquivos de projeto, o tempo de compilação estava começando a ficar muito lento.
Agora, com apenas 65 arquivos de origem, leva cerca de 8/10 segundos para compilar a cada vez. Não é muito rápido .
Eu não vi nenhum post falando sobre esse problema, exceto este , mas era uma versão antiga do Xcode 6. Então, estou me perguntando se sou o único nesse caso.
ATUALIZAR
Eu verifiquei alguns projetos Swift no GitHub como Alamofire , Euler e CryptoSwift , mas nenhum deles tinha arquivos Swift suficientes para comparar. O único projeto que achei que estava começando um tamanho decente foi o SwiftHN e, embora tivesse apenas uma dúzia de arquivos de origem, ainda era possível verificar a mesma coisa, um espaço simples e todo o projeto precisavam de recompilação, que estava começando a demorar um pouco. pouco tempo (2/3 segundos).
Comparado com o código Objective-C, onde o analisador e a compilação são rápidos, parece que o Swift nunca será capaz de lidar com grandes projetos, mas, por favor, me diga que estou errado.
ATUALIZAÇÃO Com o Xcode 6 Beta 7
Ainda não houve nenhuma melhoria. Isso está começando a ficar ridículo. Com a falta de #import
Swift, eu realmente não vejo como a Apple poderá otimizar isso.
ATUALIZAÇÃO Com o Xcode 6.3 e o Swift 1.2
A Apple adicionou compilações incrementais (e muitas outras otimizações do compilador). Você precisa migrar seu código para o Swift 1.2 para ver esses benefícios, mas a Apple adicionou uma ferramenta no Xcode 6.3 para ajudá-lo:
CONTUDO
Não se alegrem muito rápido como eu. O solucionador de gráficos que eles usam para tornar a construção incremental ainda não está muito otimizado.
De fato, primeiro, ele não considera as alterações de assinatura de função; portanto, se você adicionar um espaço no bloco de um método, todos os arquivos, dependendo dessa classe, serão recompilados.
Segundo, parece criar a árvore com base nos arquivos que foram recompilados, mesmo que uma alteração não os afete. Por exemplo, se você mover essas três classes para arquivos diferentes
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Agora, se você modificar FileA
, o compilador obviamente marcará FileA
como recompilado. Também recompilará FileB
(isso seria bom com base nas alterações de FileA
), mas também FileC
porque FileB
é recompilado, e isso é muito ruim porque FileC
nunca é usado FileA
aqui.
Espero que eles melhorem o solucionador de árvores de dependência ... Abri um radar com esse código de exemplo.
ATUALIZAÇÃO Com Xcode 7 beta 5 e Swift 2.0
Ontem a Apple lançou o beta 5 e dentro das notas de lançamento pudemos ver:
Swift Language & Compiler • Compilações incrementais: alterar apenas o corpo de uma função não deve mais fazer com que os arquivos dependentes sejam reconstruídos. (15352929)
Eu tentei e devo dizer que está funcionando muito (realmente!) Bem agora. Eles otimizaram muito as construções incrementais rapidamente.
Eu recomendo que você crie uma swift2.0
ramificação e mantenha seu código atualizado usando o XCode 7 beta 5. Você ficará satisfeito com os aprimoramentos do compilador (no entanto, eu diria que o estado global do XCode 7 ainda é lento e com erros)
ATUALIZAÇÃO Com o Xcode 8.2
Já faz um tempo desde a minha última atualização sobre esse problema, então aqui está.
Nosso aplicativo agora tem cerca de 20 mil linhas de código Swift quase exclusivamente, o que é decente, mas não excepcional. Foi submetido à migração rápida 2 e à migração rápida 3. Demora cerca de 5 / 6m para compilar em um Macbook pro de meados de 2014 (Intel Core i7 a 2,5 GHz), o que é bom em uma construção limpa.
No entanto, a construção incremental ainda é uma piada, apesar da Apple alegar que:
O Xcode não reconstruirá um destino inteiro quando apenas pequenas alterações ocorrerem. (28892475)
Obviamente, acho que muitos de nós rimos depois de verificar essa bobagem (adicionar uma propriedade privada (privada!) A qualquer arquivo do meu projeto recompilará a coisa toda ...)
Gostaria de apontar para este tópico nos fóruns de desenvolvedores da Apple, que têm mais algumas informações sobre o problema (além de apreciar a comunicação do desenvolvedor da Apple sobre o assunto de vez em quando)
Basicamente, as pessoas sugerem algumas coisas para tentar melhorar a construção incremental:
- Adicione uma
HEADER_MAP_USES_VFS
configuração de projeto definida comotrue
- Desativar
Find implicit dependencies
do seu esquema - Crie um novo projeto e mova sua hierarquia de arquivos para o novo.
Vou tentar a solução 3, mas a solução 1/2 não funcionou para nós.
O que é ironicamente engraçado em toda essa situação é que, olhando para o primeiro post sobre esse problema, estávamos usando o Xcode 6 com o código swift 1 ou swift 1.1 quando atingimos a lentidão das primeiras compilações e agora cerca de dois anos depois, apesar das melhorias reais da Apple. situação é tão ruim quanto era com o Xcode 6. Que irônico.
Na verdade, eu realmente se arrepender de escolher Swift sobre Obj / C para o nosso projeto por causa da frustração diária que envolve. (Eu até mudo para o AppCode, mas isso é outra história)
De qualquer forma, vejo este post de SO com 32k + visualizações e 143 ups até o momento em que escrevi, então acho que não sou o único. Aguente firme, apesar de serem pessimistas com relação a essa situação, pode haver alguma luz no fim do túnel.
Se você tiver tempo (e coragem!), Acho que a Apple agradece o radar sobre isso.
Até a próxima! Felicidades
ATUALIZAÇÃO Com o Xcode 9
Tropeçar nisso hoje. O Xcode introduziu discretamente um novo sistema de compilação para melhorar o desempenho terrível atual. Você deve habilitá-lo através das configurações da área de trabalho.
Ainda tentei, mas atualizará esta postagem depois que ela terminar. Parece promissor.