С ростом проекта, скорость компиляции проекта замедляется. Особенно это заметно становится, когда тестируешь программу, делая параллельно небольшие изменения в программе.
Сначала давайте узнаем как долго компилируется проект до наших улучшений. ЧТобы это сделать надо в терминале ввести
Для этого нужно зайти в раздел Product зажать alt и нажать Clean Build Folder, а потом собрать проект заново. Мой проект компилируется 81 секунду. Посмотрим какой результат будет после улучшения.
Нам, в первую очередь, стоит узнать какие места приводят к замедлению компиляции. По умолчанию Xcode не показывает предупреждения, где проблема, но мы можем это исправить.
Самые «тяжелые» места большие функции и проверка типов. Поэтому нам нужно вписать эти две строчки в раздел Build Settings -> Other Swift Flags -> Debug
(здесь у нас стоит 100мс время компиляции, мы можем поставить любое число)
Пример моего рабочего проекта
У меня есть участок который занимает 13778 ms, скорее всего у вас не будет такого, но из-за специфики проекта у меня такие участки есть. Так как там построено бинарное дерево для OCR.
Из-за глубокой вложенности друг в друга и определения типа только в самом начале, перед знаком равенства, компилятору требуется много времени понять какой перед ним тип. (Дерево занимает 30 строк, вот его часть)
До
После
Мы определили тип для каждой вложенности и предупреждение ушло.
Еще одно слабое место несколько замыканий подряд.
До
После
Явно указали тип
После исправления всех предупреждений проверим время сборки проекта снова.
Теперь проект компилируется 26 секунд в два с половиной раза быстрей.
Там еще есть над чем работать, но самые явные проблемы были исправлены.
Сначала давайте узнаем как долго компилируется проект до наших улучшений. ЧТобы это сделать надо в терминале ввести
defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES
Для этого нужно зайти в раздел Product зажать alt и нажать Clean Build Folder, а потом собрать проект заново. Мой проект компилируется 81 секунду. Посмотрим какой результат будет после улучшения.
Нам, в первую очередь, стоит узнать какие места приводят к замедлению компиляции. По умолчанию Xcode не показывает предупреждения, где проблема, но мы можем это исправить.
Самые «тяжелые» места большие функции и проверка типов. Поэтому нам нужно вписать эти две строчки в раздел Build Settings -> Other Swift Flags -> Debug
-Xfrontend -warn-long-function-bodies=100
-Xfrontend -warn-long-expression-type-checking=100
(здесь у нас стоит 100мс время компиляции, мы можем поставить любое число)
Наглядный рисунок
Пример моего рабочего проекта
У меня есть участок который занимает 13778 ms, скорее всего у вас не будет такого, но из-за специфики проекта у меня такие участки есть. Так как там построено бинарное дерево для OCR.
Из-за глубокой вложенности друг в друга и определения типа только в самом начале, перед знаком равенства, компилятору требуется много времени понять какой перед ним тип. (Дерево занимает 30 строк, вот его часть)
До
После
Мы определили тип для каждой вложенности и предупреждение ушло.
Еще одно слабое место несколько замыканий подряд.
До
После
Явно указали тип
После исправления всех предупреждений проверим время сборки проекта снова.
Теперь проект компилируется 26 секунд в два с половиной раза быстрей.
Там еще есть над чем работать, но самые явные проблемы были исправлены.
Комментарии (6)
Erraendil
07.02.2019 16:48ArtMartiros medium.com/@joshgare/8-tips-to-speed-up-your-swift-build-and-compile-times-in-xcode-73081e1d84ba
В таких случаях нужно ставить тэг «перевод» и давать ссылку на первоисточник.ArtMartiros Автор
07.02.2019 17:06Хорошо, но тут помимо того, что было в статье еще и мои дополнения, а так же разбор на моем проекте. Из статьи я изначально подчерпнул нужную инфу, а дальше уже сам дополнил.
arielf
07.02.2019 21:30Раньше очень любил Mac OS X и считал её лучшей OS — но насильное впихивание Swift и убирание полезных низкоуровневых вещей было зря
varton86
Спасибо, полезно.
Можно еще смотреть время компиляции в Report Navigator. Но так удобнее видеть, да.
Подозреваю, что включение этих warning приведет к большому кол-ву сообщений в сторонних фреймворках :)
OutLander
Нет, не приведёт. Кстати на гитхабе есть небольшой репозиторий с советами по оптимизации Swift Build Time. Описанный метод также включён в список.
ArtMartiros Автор
Спасибо, буду стараться и дальше выкладывать интересное.