Что касается оптимизации, выполняемой компилятором (GCC), какова стандартная практика? Что делает каждый вариант (-O, -O1, -O2, -O3, -Os, -s, -expensive-optimizations) по-разному и как я могу решить, что оптимально?
Сколько я должен оптимизировать?
Ответ 1
Обычно -O2 - хороший уровень оптимизации, чтобы попробовать сначала.
Однако, если вам нужен лучший результат, вы в конечном итоге попробуете множество уровней оптимизации, поскольку заранее не можете сказать, какой уровень будет лучше для вашего приложения.
Также обратите внимание, что результаты оптимизации должны различаться в зависимости от каждого процессора (на некоторых процессорах, оптимизирующих размер, фактически может обеспечить лучшую скорость, чем оптимизация скорости).
Для дальнейшего использования здесь краткое описание каждого уровня (вы можете найти полное описание в документации http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html):
-O (идентичный -O1): С -O компилятор пытается уменьшить размер кода и время выполнения без каких-либо оптимизаций, требующих большого времени компиляции.
-O2: оптимизируйте еще больше. GCC выполняет почти все поддерживаемые оптимизации, которые не связаны с компрометацией космической скорости. По сравнению с -O, этот параметр увеличивает как время компиляции, так и производительность сгенерированного кода.
-O3: оптимизируйте еще больше. -O3 включает все оптимизации, заданные -O2, а также включает -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-vectorize, -ftree-partial-pre и - Параметры fipa-cp-clone.
-Os: оптимизируйте размер. -O разрешает все оптимизации -O2, которые обычно не увеличивают размер кода. Он также выполняет дальнейшую оптимизацию, предназначенную для уменьшения размера кода.
-Ofast: игнорировать строгое соблюдение стандартов. -Ofast позволяет оптимизировать все -O3. Он также позволяет оптимизировать, которые недействительны для всех стандартных совместимых программ. Он включает -fast-math и Fortran-specific -fno-protect-parens и -fstack-массивы. Если вы используете несколько опций -O, с номерами уровней или без них, последний такой вариант является эффективным.
Ответ 2
Ядро Linux Makefile
обеспечивает как -O2
, так и -Os
. Любой из них был бы уместен, если бы не была подробная информация.
-Os
оптимизируется для небольшого хранения. Поскольку в наши дни процессоры значительно быстрее, чем основная память, оптимизация для небольшого хранилища имеет смысл даже на огромных машинах - любое время, затрачиваемое на то, чтобы кеш был заполнен из основной памяти, теряется впустую. Поэтому максимально используйте кеш команд, компилируя для повышения эффективности пространства, и, возможно, время выполнения также улучшится.
-O2
запускает все "обычные оптимизации", и выбранные оптимизации будут безопасными. (Я слышал, что некоторые из оптимизаций -O3
не всегда безопасны, но это может быть связано с тем, что ядро Linux работает с некоторыми ограничениями, не обычными для обычных приложений.)
Лучшим ответом, конечно же, является компиляция вашего программного обеспечения с несколькими уровнями оптимизации; сколько времени потребуется, чтобы скомпилировать программное обеспечение и время, необходимое для того, чтобы программное обеспечение проходило через типичные тестовые тесты. Измерьте, сколько памяти используется для всех.
Затем выберите "лучшую" комбинацию скорости компиляции, времени выполнения и использования памяти времени выполнения. Возможно, вам нужны самые быстрые компиляции, или вам может понадобиться быстрое время выполнения, или вы можете попытаться вместить меньший объем памяти от виртуального хостинг-провайдера, чтобы сэкономить деньги.
Возможно, справедливо выбрать -O2
без каких-либо измерений.