Я использую Xcode 6 Beta 6.
Это то, что меня раздражало уже какое-то время, но оно доходит до того момента, когда его едва можно использовать сейчас.
Мой проект начинает иметь приличный размер 65 файлов Swift и несколько мостовых файлов Objective-C (которые на самом деле не являются причиной проблемы).
Кажется, что любая небольшая модификация любого файла Swift (например, добавление простого пробела в класс, который почти не используется в приложении) приведет к перекомпиляции всех файлов Swift для указанной цели.
После более глубокого расследования я обнаружил, что на 100% времени компилятора приходится на фазу CompileSwift
, где Xcode запускает команду swiftc
для всех файлов Swift вашей цели.
Я провел некоторое исследование, и если я только поддерживаю делегат приложения с контроллером по умолчанию, компиляция выполняется очень быстро, но по мере того, как я добавлял все больше и больше моих файлов проектов, время компиляции начиналось очень медленно.
Теперь, когда всего 65 исходных файлов, каждый раз требуется компиляция. Не очень быстро.
Я не видел ни одного сообщения об этой проблеме, кроме этого, но это была старая версия Xcode 6. Поэтому мне интересно, m единственный в этом случае.
UPDATE
Я проверил несколько проектов 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
здесь.
Поэтому я надеюсь, что они улучшат этот решатель дерева зависимостей... Я открыл radar с этим примером кода.
ОБНОВЛЕНИЕ С Xcode 7 beta 5 и Swift 2.0
Вчера Apple выпустила бета-версию 5 и в примечаниях к выпуску, которые мы могли видеть:
Язык и компилятор Swift • Инкрементальные сборки: изменение всего тела функции больше не должно перестраивать зависимые файлы. (15352929)
Я попробовал, и я должен сказать, что он действительно работает (действительно!). Они значительно оптимизировали инкрементные сборки в быстром режиме.
Я настоятельно рекомендую вам создать ветку swift2.0
и обновить свой код с помощью XCode 7 beta 5. Вы будете довольны усовершенствованиями компилятора (однако я бы сказал, что глобальное состояние XCode 7 по-прежнему медленный и багги)
ОБНОВЛЕНИЕ С Xcode 8.2
Прошло некоторое время со времени моего последнего обновления по этой проблеме, так что вот оно.
Наше приложение теперь содержит около 20 тыс. строк почти исключительно кода Swift, который является достойным, но не выдающимся. Он прошел быстрые 2 и быстрее, чем 3 миграции. Требуется около 5/6 м для компиляции в середине 2014 года Macbook pro (2,5 ГГц Intel Core i7), который в порядке с чистой сборкой.
Однако инкрементная сборка все еще шутка, несмотря на то, что Apple утверждает, что:
Xcode не будет восстанавливать целую цель, когда произошли только небольшие изменения. (28892475)
Очевидно, я думаю, что многие из нас просто рассмеялись после проверки этой глупости (добавив одно частное (личное!) свойство в любой файл моего проекта, перекомпилирует все это...)
Я хотел бы указать вам, ребята, на эту тему на форумах разработчиков Apple, у которых есть дополнительная информация об этой проблеме (а также оценены Яблоко Dev сообщение по этому вопросу время от времени)
В основном люди придумали несколько вещей, чтобы попытаться улучшить инкрементную сборку:
- Добавьте параметр проекта
HEADER_MAP_USES_VFS
, установленный вtrue
- Отключите
Find implicit dependencies
от вашей схемы. - Создайте новый проект и переместите иерархию файлов на новый.
Я попробую решение 3, но решение 1/2 не работает для нас.
Какая иронически смешная во всей этой ситуации заключается в том, что, глядя на первое сообщение по этому вопросу, мы использовали Xcode 6, я считаю, что быстрый 1 или быстрый код 1.1, когда мы достигли первой компиляции, и теперь примерно через два года, несмотря на фактические улучшения от Apple ситуация такая же плохая, как и с Xcode 6. Как иронично.
Я действительно ДЕЙСТВИТЕЛЬНО сожалею о выборе Swift над Obj/C для нашего проекта из-за ежедневного разочарования, которое он включает. (Я даже переключаюсь на AppCode, но это другая история)
В любом случае я вижу, что это сообщение SO имеет 32k + просмотров и 143 всплеска на момент написания, поэтому я думаю, что я не единственный. Повесьте туда ребята, несмотря на то, что они пессимистичны в этой ситуации, в конце туннеля может быть какой-то свет.
Если у вас есть время (и мужество!), я думаю, Apple приветствует радар об этом.
В следующий раз! Приветствия
ОБНОВЛЕНИЕ С Xcode 9
Напоминаем этот сегодня. Xcode спокойно представил новую систему сборки, чтобы улучшить текущую ужасную производительность. Вы должны включить его через настройки рабочей области.
Попробовал еще, но будет обновлять этот пост после его завершения. Выглядит многообещающе.