Я використовую 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, коли і аналізатор, і компіляція палають швидко, це справді відчуває, що Свіфт ніколи не зможе впоратися з великими проектами, але, будь ласка, скажіть мені, що я помиляюся.
ОНОВЛЕННЯ 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, і всередині нотаток до випуску ми могли побачити:
Швидка мова та компілятор • Інкрементальна побудова: зміна лише корпусу функції більше не повинна спричиняти перебудову залежних файлів. (15352929)
Я спробував це, і я повинен сказати, що він працює (справді!) Добре зараз. Вони значно оптимізували нарощування наростів швидко.
Я настійно рекомендую створити swift2.0
гілку та оновлювати код за допомогою XCode 7 beta 5. Вас порадують вдосконалення компілятора (однак я б сказав, що глобальний стан XCode 7 все ще повільний і непомітний)
ОНОВЛЕННЯ З Xcode 8.2
Минуло час з мого останнього оновлення з цього питання, ось ось воно.
Наше додаток нараховує приблизно 20 тис. Рядків майже виключно коду Swift, що є пристойним, але не видатним. Він зазнав швидкої міграції 2, а потім швидкої міграції 3. На середину 2014 року Macbook pro (2,5 ГГц Intel Core i7) потрібно близько 5/6 м, що добре в чистоті.
Однак додаткове нарощування все ще є жартом, незважаючи на те, що Apple заявляє, що:
Xcode не відновить цілі, якщо відбулися лише невеликі зміни. (28892475)
Очевидно, я думаю, що багато хто з нас просто посміялися після перевірки цієї дурниці (додавання одного приватного (приватного!) Властивості до будь-якого файлу мого проекту перекомпілює все це ...)
Я хотів би вказати вам, хлопці, на цю тему на форумах розробників Apple, де є додаткова інформація про цю проблему (а також високо цінується спілкування Apple Dev з цього питання)
В основному люди придумали кілька речей, щоб спробувати покращити нарощення:
- Додайте
HEADER_MAP_USES_VFS
налаштування проекту доtrue
- Відключення
Find implicit dependencies
від вашої схеми - Створіть новий проект та перемістіть ієрархію файлів до нового.
Я спробую розв’язати рішення 3, але рішення 1/2 не працювало для нас.
Іронічно смішно у всій цій ситуації полягає в тому, що, дивлячись на першу публікацію з цього питання, ми використовували Xcode 6, я вважаю, що швидкий код 1 або swift 1.1, коли ми досягли першої млявості компіляції, а тепер приблизно через два роки, незважаючи на фактичні вдосконалення від Apple, ситуація так само погана, як і з Xcode 6. Як іронічно.
Я дійсно шкодую, що вибрав Swift над Obj / C для нашого проекту через щоденні фрустрації, які він пов’язаний. (Я навіть переходжу на AppCode, але це вже інша історія)
У будь-якому випадку я бачу, що ця публікація має 32 тис. + Переглядів і 143 підйоми на цей час, тому я думаю, що я не єдиний. Повісьте там, хлопці, незважаючи на песимізм щодо цієї ситуації, може бути світло в кінці тунелю.
Якщо у вас є час (і сміливість!), Я думаю, Apple вітає радіолокацію з цього приводу.
До наступного разу! Ура
ОНОВЛЕННЯ Xcode 9
Натрапляйте на це сьогодні. Xcode тихо представив нову систему складання, щоб покращити поточну жахливу продуктивність. Ви повинні ввімкнути це через налаштування робочої області.
Спробували ще, але оновлять цю публікацію після її завершення. Хоча це виглядає перспективно.