С ростом проекта, скорость компиляции проекта замедляется. Особенно это заметно становится, когда тестируешь программу, делая параллельно небольшие изменения в программе.

Сначала давайте узнаем как долго компилируется проект до наших улучшений. ЧТобы это сделать надо в терминале ввести

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)


  1. varton86
    07.02.2019 09:25

    Спасибо, полезно.
    Можно еще смотреть время компиляции в Report Navigator. Но так удобнее видеть, да.
    Подозреваю, что включение этих warning приведет к большому кол-ву сообщений в сторонних фреймворках :)


    1. OutLander
      07.02.2019 09:47

      Нет, не приведёт. Кстати на гитхабе есть небольшой репозиторий с советами по оптимизации Swift Build Time. Описанный метод также включён в список.


    1. ArtMartiros Автор
      07.02.2019 09:47

      Спасибо, буду стараться и дальше выкладывать интересное.


  1. Erraendil
    07.02.2019 16:48

    ArtMartiros medium.com/@joshgare/8-tips-to-speed-up-your-swift-build-and-compile-times-in-xcode-73081e1d84ba

    В таких случаях нужно ставить тэг «перевод» и давать ссылку на первоисточник.


    1. ArtMartiros Автор
      07.02.2019 17:06

      Хорошо, но тут помимо того, что было в статье еще и мои дополнения, а так же разбор на моем проекте. Из статьи я изначально подчерпнул нужную инфу, а дальше уже сам дополнил.


  1. arielf
    07.02.2019 21:30

    Раньше очень любил Mac OS X и считал её лучшей OS — но насильное впихивание Swift и убирание полезных низкоуровневых вещей было зря