Влияет ли сама компиляция с -g на производительность?
(Это вопрос о gcc и clang, но может относиться к другим компиляторам.)
Если я скомпилирую код на C или C++ и сгенерирую отладочную информацию, используя -g
switch, это само по себе ухудшает производительность скомпилированной программы... (1.) С минимальной оптимизацией (-O0
)? (2.) С максимальной оптимизацией (-O3
)?
Примечание: я не имею в виду снижение производительности из-за необходимости разбора / загрузки исполняемого файла, которое больше из-за дополнительного содержимого; Я имею в виду код, который запускается.
3 ответа
Я не думаю, что есть разница в производительности. Действительно, сгенерированный код будет таким же и -g
можно использовать с -O
согласно документации здесь. Кроме того, символы отладки записываются не в код, а в другой раздел, называемый "раздел отладки", который даже не загружается во время выполнения (только отладчиком).
-g
не изменит то, какие оптимизации выполняются или генерируется код. Это политика GCC, как указано здесь
Однако может быть полезно отметить, что в той же документации говорится, что:
Сокращения, используемые оптимизированным кодом, могут иногда вызывать удивление: некоторые объявленные вами переменные могут вообще не существовать; поток контроля может ненадолго переместиться туда, где вы этого не ожидали; некоторые операторы могут не выполняться, потому что они вычисляют постоянные результаты или их значения уже имеются; некоторые операторы могут выполняться в разных местах, потому что они были удалены из циклов. Тем не менее, можно отлаживать оптимизированный вывод. Это делает разумным использование оптимизатора для программ, которые могут иметь ошибки.
Таким образом, в конце концов, отладка никогда не повредит вашей оптимизации, но обратное неверно и использует -O3
может ухудшить вашу информацию отладки (например, удалив бесполезные переменные).
Обратите внимание, что в этом случае лучше использовать -Og
(как указано здесь), так как это будет:
Оптимизировать опыт отладки. -Og включает оптимизации, которые не мешают отладке. Это должен быть выбранный уровень оптимизации для стандартного цикла редактирования-компиляции-отладки, обеспечивающий разумный уровень оптимизации при одновременной поддержке быстрой компиляции и хорошей отладке.
Однако это повлияет на производительность, потому что некоторые этапы оптимизации, которые будут мешать отладке, не будут выполнены.
Редактировать:
Ссылки и цитаты ответят на ваш вопрос gcc
Это может не относиться к другим компиляторам, таким как clang
, Однако я также нашел некоторую документацию для clang
, Например здесь:
По сути, отладочная информация позволяет вам скомпилировать программу с "-O0 -g" и получить полную отладочную информацию, что позволяет произвольно модифицировать программу при ее запуске из отладчика. Компиляция программы с "-O3 -g" дает вам полную отладочную информацию, которая всегда доступна и точна для чтения (например, вы получаете точные трассировки стека, несмотря на удаление и вставку хвостовых вызовов), но вы можете потерять возможность изменять программу и вызывать функции, которые были оптимизированы вне программы или полностью выделены.
Флаг -g добавляет отладочную информацию в двоичный файл. Это существует в отдельном разделе (.stab
а также .stabstr
) исполняемого файла из .text
Процессор работает немного. При запуске вне отладчика раздел отладки не загружается загрузчиком операционной системы. Отладочная информация также может быть легко удалена с помощью strip
утилита для генерации двоичных файлов, идентичных скомпилированным без флага -g.
Обычно, однако, когда вы хотите отладить что-то, вы будете компилироваться без оптимизации и макроса препроцессора NDEBUG. Однако эти вещи не контролируются флагом -g.
Не будет никакого снижения производительности, если вы запустите его вне отладчика. Символы отладки должны помочь отладке. Сгенерированный код должен быть одинаковым в обоих случаях.