Влияет ли сама компиляция с -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.

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

Другие вопросы по тегам