В чем разница между оптимизацией одного файла и оптимизацией всего модуля

Я замечаю, что в настройках проекта есть две настройки оптимизации:

  • Оптимизация одного файла
  • Оптимизация всего модуля

Какая разница? И какой из них выбрать при каких обстоятельствах?

2 ответа

Решение

Оптимизация одного файла

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

Pros

  • При выполнении инкрементной компиляции компилятору не нужно перекомпилировать весь ваш проект, и вместо этого он может перекомпилировать только файлы, которые были изменены, или полагаться на файлы, которые изменились
  • Компилятор запускает один экземпляр на файл, поэтому на компьютере с несколькими ядрами он может компилироваться быстрее

Cons

  • Некоторые оптимизации не будут выполняться, если оптимизируемый контент охватывает несколько файлов
  • Компилятор должен получить некоторую информацию из других файлов, поэтому он может повторять эту работу больше раз, чем необходимо (если 6 файлов ссылаются на один другой файл, этот файл может выполнять некоторую работу над ним 6 раз, когда требуется только 1)

Оптимизация всего модуля

Этот режим оптимизации запускает один экземпляр внешнего интерфейса для всего вашего модуля. Он запускает оптимизацию для всех файлов одновременно.

Pros

  • Это выполнит максимальные оптимизации, которые может выполнить компилятор swift
  • Выполняет менее избыточную работу, чем Оптимизация одного файла

Cons

  • При этом будет использоваться только одно ядро ​​ЦП, чтобы выполнить все специфичные для Swift оптимизации вашего кода. Это означает, что многоядерный компьютер не будет полностью использован для компиляции вашего кода
  • В пошаговой компиляции весь ваш модуль все равно придется перекомпилировать каждый раз

Что использовать

Для отладочных сборок я настоятельно рекомендую полностью отключить оптимизацию. Это сделает просмотр кода в отладчике более предсказуемым и сократит время сборки. Если вам действительно нужны оптимизации, вам, вероятно, следует использовать один файл для лучшего времени инкрементальной компиляции.

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

Уровень оптимизации (SWIFT_OPTIMIZATION_LEVEL) -O против -O -оптимизация всего модуля

команда swiftc

определения

  • Драйвер - корневой процесс, который решает, какой именно файл нужно скомпилировать, и запускает дочерний процесс (jobs) для компиляции, сборки и компоновки
    • Frontend Job(swift -frontend) - отвечает за компиляцию
    • ld job- статическое связывание и другие работы

составление

  • Primary-file - компиляция в один файл. Преимуществом является инкрементная компиляция и распараллеливание. Недостатком является то, что в любом случае каждое задание внешнего интерфейса должно читать все файлы в модуле перед запуском.
    • однофайловый - одно задание интерфейса для одного файла
    • партия(-enable-batch-mode) - одно задание интерфейса для одного процессора
  • Оптимизация всего модуля (WMO)(-wmo) - одинfrontend jobза один модуль. Преимуществом являются хорошие результаты оптимизации, которые отражаются на времени выполнения. Недостатком является отсутствие инкрементной сборки и худший параллелизм.

Оптимизация

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

-O -whole-module-optimization- компилятор, управляемый целым модулем. Это следующий уровень оптимизации. Начиная с Xcode v8, это по умолчанию для новых проектов и SPM для выпуска. На этом уровне компилятор имеет гораздо больше информации о вызовах. Компиляция состоит из двух больших частей (оптимизатор SIL (1/3 времени) и LLVM (2/3 тайла)). Оптимизатор SIL является узким местом и не может быть распараллелен и инкрементирован, но LLVM может

Примеры оптимизаций:

  • встроенная функция - исполняемый код по вызову функции
  • специализация функций - например, конкретная функция (новая версия функции) над общей функцией
  • операции подсчета ссылок
  • удалить ненужные функции
  • Заказ [О программе]

Также вы можете получить следующее предупреждение во время отладки с оптимизацией.

      Project was compiled with optimization — stepping may behave oddly; variables may not be available.

Это из-за дополнительного параметраfastкоторый пройден. В качестве обходного пути вы можете использовать-Ononeи добавитьuser-defined settingsкакSWIFT_WHOLE_MODULE_OPTIMIZATION=YES

Режим компиляции (SWIFT_COMPILATION_MODE)

  • Incremental- по умолчанию для отладки - компилирует устаревшие файлы
  • Whole Module- по умолчанию для выпуска

Распараллелить

      Edit Scheme -> Build -> Parallel Build
Другие вопросы по тегам