Когда использовать флаг -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 необходим.