Когда использовать флаг -O2 для gcc? - PullRequest
10 голосов
/ 20 мая 2009

Если я использую флаг "-O2", производительность улучшается, но время компиляции увеличивается.

Как я могу решить, использовать это или нет?

Может быть, O2 больше всего влияет на некоторые типы кода (например, математические вычисления?), И я должен использовать его только для тех частей проекта?

РЕДАКТИРОВАТЬ: я хочу подчеркнуть тот факт, что установка -O2 для всех компонентов моего проекта изменяет общее время компиляции с 10 минут до 30 минут.

Ответы [ 6 ]

23 голосов
/ 20 мая 2009

Я бы рекомендовал использовать -O2 большую часть времени, преимущества включают в себя:

  • Обычно уменьшает размер сгенерированного кода (в отличие от -O3).
  • Больше предупреждений (некоторые предупреждения требуют анализа, который выполняется только во время оптимизации)
  • Часто заметно улучшается производительность (что может и не иметь значения).

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

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

11 голосов
/ 20 мая 2009

Я в биоинформатике, поэтому мой совет может быть предвзятым. Тем не менее, я всегда использую переключатель -O3 (то есть для выпусков и тестовых сборок; обычно не для отладки). Правда, у него есть определенные недостатки, а именно увеличение времени компиляции и часто размер исполняемого файла.

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

Второй недостаток, размер исполняемого файла, часто просто не имеет значения.

6 голосов
/ 20 мая 2009

Никогда.

Используйте -O3 -Wall -Werror -std = [все, что должно следовать вашей кодовой базе]

5 голосов
/ 20 мая 2009

Всегда, кроме случаев, когда вы программируете и хотите просто протестировать то, что только что написали.

3 голосов
/ 20 мая 2009

У нас обычно настроена среда сборки, так что мы можем собрать отладочные сборки , использующие -O0 и релизные сборки , использующие -O3 (среда сборки сохраняет объекты и библиотеки из всех конфигураций, так что можно легко переключаться между конфигурациями). Во время разработки в основном создается и запускается конфигурация отладки для более быстрой скорости сборки (и более точной информации отладки), а также реже создается и тестируется конфигурация выпуска.

2 голосов
/ 22 мая 2009

Действительно ли увеличенное время компиляции заметно? Я все время использую -O2 в качестве значения по умолчанию, все, что меньше, просто оставляет много «трений» в вашем коде. Также обратите внимание, что уровни оптимизации -O1, -O2, как правило, лучше всего тестируются, поскольку они наиболее интересны. -O0 имеет тенденцию быть более глючным, и вы можете довольно хорошо отлаживать в -O2 по моему опыту. При условии, что у вас есть представление о том, что может сделать компилятор с точки зрения переупорядочения кода, вставки и т. Д.

- Ошибка - Стена необходима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...