Подтвердить что ты не робот

Время компиляции Невероятно медленное

Мой проект состоит из ~ 350 файлов Swift и ~ 40 cocoa зависимостей pod.

Как только весь проект был перенесен на Swift 3, время сборки было INCREDIBLY медленным и заняло чуть более 3 минут, чтобы полностью скомпилировать.
Я заметил, что если я перестрою после того, как не изменил никаких файлов, он будет построен в течение разумного промежутка времени. Однако, если я добавлю новую функцию, она займет 3 + минуты.
Cocoapods, похоже, не вызывает проблемы, поскольку он задерживается в состоянии Compiling Swift source files.

Я следовал this, чтобы исследовать:

  • Добавлен флаг -Xfrontend -debug-time-function-bodies в мой Other Swift Flags в настройках моей целевой сборки

  • Постройте проект

  • введите описание изображения здесь

  • введите описание изображения здесь

  • Скопировал это в терминал и запустил pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100

Однако я не видел ничего, что вызывало беспокойство. Файл, который занимал больше всего времени, составлял всего 250 мс. Следующий ближайший был 100 мс, даже если все 350 файлов взяли 250 мс для компиляции, это было бы всего лишь 73 секунды, что было бы далеко от 3 + минутных сборок, которые я вижу.


Что может быть причиной этих длительных периодов компиляции?

До обновления до Xcode 8 и Swift 3 он не был таким медленным.

4b9b3361

Ответ 1

Обновление 1:

Я создал новый проект без выполнения преобразования Swift 3, импортировал мои файлы Swift 3, но время сборки не изменилось.

Обновление 2:

Я пробовал SWIFT_WHOLE_MODULE_OPTIMIZATION = YES, но как только вы вносите изменения в более чем 1 файл, инкрементная сборка выходит из строя и запускает повторную сборку, которая длится более 4-5 минут.

Обновление 3:

Теперь я переписал всю свою базу кода от Swift 3 до Swift 2.3. Это не имело никакого значения, проблема заключается в компиляторе Xcode 8.

Обновление 4:

Я могу подтвердить, что снятие этих двух Проверка зависимостей немного облегчит боль, ошибка Xcode 8, похоже, связана с тем, как она проверяет зависимости между файлами.

Обновление 5:

Я преобразовал свою базу кода в Swift 3 из Swift 2.3, так как это требует Xcode 8.2 beta, бета-версия должна включать исправление для "Xcode не будет перестраивать целую цель, когда произошли только небольшие изменения" (28892475 )". К сожалению, они не исправили ошибку, и мои времена компиляции точно совпадают с Xcode 8.2 Beta.

Оригинальное сообщение:

У меня недостаточно репутации для комментариев, но я все же хотел поделиться некоторыми ресурсами. Я застрял в этом несчастье в течение нескольких дней, обновление до Swift 3 стало полной катастрофой.

Я использую эту функцию для отслеживания медленных файлов, хотя, как и вы, это не моя проблема. Что-то еще в xcode занимает буквально 4 минуты: https://github.com/irskep/swift_compile_times_parser https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

Я также убедился, что у меня нет никаких lazy vars или closures, которые не нравятся быстрому. Не используйте + operator при конкатенации строк и т.д. см. это.

Я обновлю этот ответ, если найду что-нибудь, почти невозможно быть продуктивным с банкоматом Swift 3.

Ответ 2

Я использую Xcode 8.1. Моя проблема была в словаре, который использует Nil-Coalescing Operator

это мой код, когда требуется построить 10 минут:

    let params: [String:String] = [
        "email": email ?? self.email,
        "clave": password,
        "tipo_documento": documentType?.rawValue ?? self.typeDocument.rawValue,
        "documento": number ?? self.documentNumber,
        "nombre": name ?? self.name,
        "apellidos": lastName ?? self.lastName,
        "fecha_nacimiento": birth?.parse() ?? self.birthDate.parse(),
        "genero": genre?.rawValue ?? self.genre.rawValue,
        "telefono_movil": cel ?? self.cel,
        "direccion": address ?? self.address
    ]

Я не знаю, почему, но он рекламирует меня, что словарь занимает много времени, чтобы скомпилировать.

введите описание изображения здесь

Затем я меняю его на:

    var params: [String:String] = [:]
        params["email"] = email ?? self.email
        params["clave"] = password
        params["tipo_documento"] = documentType?.rawValue ?? self.typeDocument.rawValue
        params["documento"] = number ?? self.documentNumber
        params["nombre"] = name ?? self.name
        params["apellidos"] = lastName ?? self.lastName
        params["fecha_nacimiento"] = birth?.parse() ?? self.birthDate.parse()
        params["genero"] = genre?.rawValue ?? self.genre.rawValue
        params["telefono_movil"] = cel ?? self.cel
        params["direccion"] = address ?? self.address

Надеюсь, это поможет некоторым из вас.

Ответ 3

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Версия Xcode: 8.1 GM

Чтобы добавить выбранную цель, перейдите к Editor > Add Build Setting > Add User-Defined Setting и добавьте выше.

Мое чистое время сборки сократилось с 35 минут (хватит, извините) до 8 минут с количеством файлов проекта 800.

Примечание. Сначала пробовал это на Xcode 8.0, но не работал.

Ответ 4

Я нашел пару стилей кодирования, которые занимают много времени в Swift (2.3, не проверены на 3):

a += b 

Должно быть

a = a + b

Также добавим массив вместе:

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c

Должно быть

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d : [Int] = []
d.appendContentsOf(a)
d.appendContentsOf(b)
d.appendContentsOf(c)

Последняя оптимизация заняла время компиляции для 1 метода с 9800 мс до 5,5 мс...

Ответ 5

Кроме того, string concatenation кажется невероятным в Swift3/XCode8:

item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")

~ потребовалось 8-10 секунд для компиляции

item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"

~ потребовалось 1,6 секунды для компиляции

item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();

~ занял 0,001 секунды, чтобы скомпилировать

Ответ 6

Я перенес проект Swift 2x из 17 файлов в Swift 3 и имел 28 предупреждений и 55 ошибок во всех файлах. Время компиляции составляло 4-5 минут.

Отключение

Find Implicit Dependancies 

в схеме и

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

сделаны только незначительные улучшения.

Как я в конечном итоге очистил предупреждения и ошибки в каждом файле, время компиляции сократилось и теперь находится в секундах. IDE ведет себя так же, как и должно - обнаруживает ошибки в ближайшем реальном времени и быстро компилируется.

Во-первых, похоже, что компилятор перекомпилирует (или, по крайней мере, перекрестно проверяет) каждый файл с любой ошибкой или предупреждением - даже если вы не отредактировали этот файл с момента последнего компиляции.

Во-вторых, если в файлах слишком много зависимых ошибок/предупреждений, узкие места компилятора и замедляются.

Ответ 7

Всякий раз, когда вы сталкиваетесь с проблемой медленной компиляции, внимательно просматриваете сторонние SDK, которые вы включили в свое приложение, а также пытаетесь найти свои методы кодирования.

Я сталкиваюсь с этой проблемой дважды в своем приложении, и я чувствовал себя так же встревожен Swift 3 😡. Оба момента времени были разными.

В первый раз я обнаружил, что добавил библиотеку в мое приложение под названием AASignatureView. Поскольку этот lib был добавлен, мое время компиляции увеличилось, как ад. Он начал принимать около 12-15 минут при запуске приложения на симуляторе. Проблема была решена после того, как я удалил эту библиотеку из моего кода и добавил VMSignatureView, и мое время компиляции перешло в нормальное состояние.

Во второй раз я столкнулся с этой проблемой после создания кода добавления нескольких строк. Оба эти метода ниже превратили время компиляции приложений в ад

a = a + b

и

a += b

Затем я изменил свой код ниже, и проблема была решена.

a = "a\(strSometihng),\(strAnother)"