Увеличивает ли количество файлов, импортированных в заголовок моста, время компиляции?

У меня есть теория, но я не знаю, как ее проверить. У нас довольно большой проект iOS около 200 файлов Swift и 240 файлов obj-C (и одинаковое количество файлов заголовков). Мы все еще находимся на Swift 1.2, что означает, что довольно регулярно весь проект перестраивается.

Я заметил, что каждый .swift файл занимает около 4-6 секунд для компиляции; в других проектах это не более 2.

Теперь я заметил, что в выводе сборки предупреждения, сгенерированные в файлах заголовков, повторяются для каждого файла .swift, что заставляет меня поверить, что быстрый компилятор повторно проанализирует все заголовки, включенные в заголовок моста. Поскольку в заголовочном заголовке имеется ~ 160 операторов импорта, этот тип добавляет.

Итак, основные вопросы:

  • Увеличивает ли размер нашего мостового заголовка время сборки?
  • Есть ли способ оптимизировать это, поэтому он анализирует заголовки только один раз?
  • Есть ли у этой версии проблемы Swift 2?
  • Любые другие трюки, чтобы оптимизировать это? Кроме того, переписывая все в Swift, этот слишком трудоемкий проект для нас в настоящее время.

Ответ 1

Я могу говорить только из опыта, который у меня есть на моем предыдущем рабочем месте, то есть некоторые вещи могли измениться. Кроме того, я не уверен, что это помогает вашему конкретному случаю, поскольку вы смешиваете Objective C и Swift, которые я никогда не делал, но теория все еще звучит.

Короче говоря, да, размер заголовка моста влияет на время компиляции, и вы правы, что он анализирует его один раз для каждого файла/включения.

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

Ответ 2

Увеличивает ли размер нашего мостового заголовка время сборки?

Совершенно верно. Чем больше файлов включено в ваш заголовок моста, тем больше времени требуется, чтобы компилятор разбирал их. Это то, что пытался исправить Precompiled Header. Файлы PCH были отключены в пользу модулей.

Есть ли способ оптимизировать это, поэтому он анализирует заголовки только один раз?

Честно говоря, я не знаю, это зависит от ваших исходных файлов и зависимостей.

Есть ли у этой версии проблема Swift 2?

Да, но оптимизация компилятора намного лучше в новых версиях Xcode и Swift. Опять же, подчеркивая Модули вместо Precompiled Header файлов здесь. Я должен отметить, что можно передать файл pch непосредственно в clang, но это редко бывает хорошей идеей.

Если можно, я бы экспериментировал с использованием заголовка pch в гибридном проекте. Я бы также подумал о создании предварительно скомпилированных библиотек или статических фреймворков, чтобы предотвратить постоянную перестройку классов. Там отличное видео WWDC с 2013 года, в котором представлены модули, я настоятельно рекомендую посмотреть его.

Литература: