Я использую Xcode 6 Beta 6.
Это то, что беспокоило меня в течение некоторого времени, но сейчас оно достигло точки, когда его едва ли можно использовать.
Мой проект начинает иметь приличный размер 65 Swift-файлов и несколько мостовых файлов Objective-C (которые на самом деле не являются причиной проблемы).
Кажется, что любое небольшое изменение любого файла Swift (например, добавление простого пробела в классе, который едва используется в приложении) приведет к перекомпиляции всех файлов Swift для указанной цели.
После более глубокого исследования я обнаружил, что то, что занимает почти 100% времени компилятора, - это CompileSwift
фаза, когда XCode запускает swiftc
команду для всех файлов Swift вашей цели.
Я провел дальнейшее исследование, и если я оставлю делегат приложения только с контроллером по умолчанию, компиляция будет очень быстрой, но, поскольку я добавлял все больше и больше файлов моего проекта, время компиляции стало очень медленным.
Теперь, имея только 65 исходных файлов, каждый раз для компиляции требуется около 8/10 секунд. Не очень быстро .
Я не видел ни одного поста, рассказывающего об этой проблеме, кроме этой , но это была старая версия Xcode 6. Поэтому мне интересно, единственный ли я в этом случае.
ОБНОВИТЬ
Я проверил несколько проектов Swift на GitHub, таких как Alamofire , Euler и CryptoSwift , но ни у одного из них не было достаточно файлов Swift для сравнения. Единственный проект, который я нашел, у которого был приличный размер, был SwiftHN , и, хотя в нем было всего дюжина исходных файлов, я все еще мог проверить одно и то же, один простой пробел и весь проект нуждался в перекомпиляции, которая начинала принимать мало времени (2/3 секунды).
По сравнению с кодом Objective-C, где анализатор и компиляция работают быстро, на самом деле кажется, что Swift никогда не сможет обрабатывать большие проекты, но, пожалуйста, скажите, что я ошибаюсь.
ОБНОВЛЕНИЕ с Xcode 6 Beta 7
Все еще никакого улучшения вообще. Это начинает становиться смешным. Из-за отсутствия #import
Swift я действительно не понимаю, как Apple сможет когда-либо оптимизировать это.
ОБНОВЛЕНИЕ С Xcode 6.3 и Swift 1.2
Apple добавила инкрементные сборки (и многие другие оптимизации компилятора). Вы должны перенести свой код в Swift 1.2, чтобы увидеть эти преимущества, но Apple добавила инструмент в Xcode 6.3, чтобы помочь вам сделать это:
ТЕМ НЕ МЕНИЕ
Не радуйся так быстро, как я. Решатель графиков, который они используют для создания инкрементальной сборки, еще не очень хорошо оптимизирован.
Действительно, во-первых, он не рассматривает изменения сигнатур функций, поэтому, если вы добавите пробел в блок одного метода, все файлы, зависящие от этого класса, будут перекомпилированы.
Во-вторых, создается дерево на основе файлов, которые были перекомпилированы, даже если изменение не влияет на них. Например, если вы переместите эти три класса в разные файлы
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Теперь, если вы измените FileA
, компилятор, очевидно, пометит FileA
для перекомпиляции. Он также будет перекомпилирован FileB
(это будет нормально на основе изменений в FileA
), но также FileC
потому, что FileB
он перекомпилирован, и это довольно плохо, потому что здесь FileC
никогда не используется FileA
.
Поэтому я надеюсь, что они улучшат этот решатель дерева зависимостей ... Я открыл радар с этим примером кода.
ОБНОВЛЕНИЕ С Xcode 7 beta 5 и Swift 2.0
Вчера Apple выпустила бета-версию 5, и внутри заметок о выпуске мы могли видеть:
Swift Language & Compiler • Инкрементные сборки: изменение только тела функции больше не должно приводить к перестроению зависимых файлов. (15352929)
Я дал ему попробовать, и я должен сказать, что он работает очень (очень!) Хорошо сейчас. Они значительно оптимизировали инкрементные сборки в swift.
Я настоятельно рекомендую вам создать swift2.0
ветку и поддерживать ваш код в актуальном состоянии, используя XCode 7 beta 5. Вы будете довольны улучшениями компилятора (однако я бы сказал, что глобальное состояние XCode 7 все еще медленное и глючное)
ОБНОВЛЕНИЕ С Xcode 8.2
Прошло много времени с момента моего последнего обновления по этому вопросу, так что вот оно.
Наше приложение теперь содержит около 20 тыс. Строк почти исключительно кода Swift, что является достойным, но не выдающимся. Он прошел быструю миграцию 2 и 3. Компиляция MacBook Pro середины 2014 года (Intel Core i7 с частотой 2,5 ГГц, 2,5 ГГц) занимает около 5/6 м, что вполне приемлемо для чистой сборки.
Однако инкрементная сборка все еще шутка, несмотря на то, что Apple утверждает, что:
Xcode не будет перестраивать всю цель, когда произошли только небольшие изменения. (28892475)
Очевидно, я думаю, что многие из нас просто смеялись после проверки этой чепухи (добавление одного частного (private!) Свойства в любой файл моего проекта перекомпилирует все это ...)
Я хотел бы указать вам, ребята, на эту ветку на форумах разработчиков Apple, на которой есть еще немного информации об этой проблеме (а также высоко ценить связь Apple с разработчиками по этому вопросу время от времени)
В основном люди придумали несколько вещей, чтобы попытаться улучшить инкрементную сборку:
- Добавить
HEADER_MAP_USES_VFS
настройки проекта вtrue
- Отключить
Find implicit dependencies
от вашей схемы - Создайте новый проект и переместите иерархию файлов в новый.
Я попробую решение 3, но решение 1/2 у нас не сработало.
Что забавно во всей этой ситуации, так это то, что, глядя на первый пост по этой проблеме, мы использовали Xcode 6 с кодом, как мне кажется, swift 1 или swift 1.1, когда мы достигли вялости первых компиляций, а теперь, спустя два года, несмотря на реальные улучшения Apple, Ситуация такая же плохая, как и в Xcode 6. Как иронично.
Я действительно ДЕЙСТВИТЕЛЬНО сожалею о том, что выбрал Swift вместо Obj / C для нашего проекта из-за ежедневного разочарования, которое оно вызывает. (Я даже переключаюсь на AppCode, но это другая история)
В любом случае, я вижу, что это ТАКОЕ сообщение имеет 32 000+ просмотров и 143 повышения на момент написания этой статьи, так что, думаю, я не единственный. Держитесь, ребята, несмотря на пессимизм по поводу этой ситуации, в конце туннеля может быть немного света.
Если у вас есть время (и смелость!), Думаю, Apple приветствует радар по этому поводу.
До следующего раза! ура
ОБНОВЛЕНИЕ с Xcode 9
Наткнуться на это сегодня. XCode незаметно представил новую систему сборки для улучшения текущей ужасной производительности. Вы должны включить его через настройки рабочего пространства.
Уже попробовали, но обновите этот пост после того, как это будет сделано. Выглядит многообещающе, хотя.