Когда использовать флаг -O2 для gcc?

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

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

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

EDIT: хочу подчеркнуть тот факт, что установка -O2 для всех компонентов моего проекта меняет общее время компиляции с 10 минут до 30 минут.

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Никогда.

Использовать -O3 -Wall -Werror -std = [независимо от того, какая ваша база кода должна следовать]

Ответ 4

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

Ответ 5

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

Ответ 6

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

-Werror -Wall необходим.