Увеличивает ли количество файлов, импортированных в заголовок моста, время компиляции?
У меня есть теория, но я не знаю, как ее проверить. У нас довольно большой проект 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 года, в котором представлены модули, я настоятельно рекомендую посмотреть его.
Литература: