В чем разница между оптимизацией одного файла и оптимизацией всего модуля
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