Подтвердить что ты не робот

Сколько я должен оптимизировать?

Что касается оптимизации, выполняемой компилятором (GCC), какова стандартная практика? Что делает каждый вариант (-O, -O1, -O2, -O3, -Os, -s, -expensive-optimizations) по-разному и как я могу решить, что оптимально?

4b9b3361

Ответ 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 без каких-либо измерений.