2013-12-19 3 views
2

Поэтому я хочу распространять приложение gcc с backtrace logging для критических ошибок. Тем не менее, это довольно критически важное приложение, поэтому я задаюсь вопросом, замедляют ли -g -rdynamic gcc-флаги (особенно если они делают выделение)? Также хотел бы дать моим пользователям максимальную производительность, поэтому я компилирую флаги оптимизации, такие как "-flto" и "-mtune", и это заставляет меня задаться вопросом, будут ли конфликты флагов, а внутри baacktrace будет безумие?Делают ли `-g -rdynamic` gcc-флаги замедление выполнения приложений (повышение производительности)?

+0

С оптимизацией на вашем стеке не будет мусора, но из-за инкрустации и некоторых других оптимизаций, возможно, не получить все кадры стека без оптимизации. – arne

+2

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

+0

@SteveJessop: общая информация о gcc/опыт работы в Linux. – myWallJSON

ответ

2

Хотя ввод символов отладки не влияет на производительность сам по себе, ваше приложение по-прежнему сильно отстает с точки зрения возможной производительности. Я имею в виду, что было бы неплохо использовать -g и -O3 одновременно, в общем. Поэтому, если ваше приложение имеет критическую производительность, но в то же время строго необходимо поддерживать хороший уровень отладки, тогда было бы разумно найти некоторый баланс между этими двумя. В последних версиях GCC нам предоставлен флаг -Og:

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

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

Еще раз не пренебрегайте чтением официальной документации GCC. LTO является относительно новой особенностью в GCC, и, как следствие, некоторые из его частей все еще экспериментальны и не предназначены для производства. Например, это прямой экстракт:

Оптимизация времени ссылки не работает с генерацией отладочной информации . Сочетание -flto с -g в настоящее время является экспериментальным, и , как ожидается, приведет к неправильным результатам.

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

ПРИМЕЧАНИЕ: Производительность от LTO обычно варьируется от 0% до 3%, и это в значительной степени зависит от основного приложения. Без профилирования вы не можете сказать, разумно ли использовать LTO для вашей ситуации, поскольку это может принести больше проблем, чем преимуществ.

Флаги как -march и -mtune обычно делают оптимизацию на очень низком уровне - уровень команд для архитектуры целевого процессора. Таким образом, я бы не ожидал, что они будут вмешиваться в отладку. Тем не менее, вас приветствует, чтобы проверить это самостоятельно с вашим приложением.

+1

Я не думаю, что это полностью отвечает на вопрос ОП. –

+0

@R .: Цели OP: 1) обеспечить отличную производительность конечным пользователям; 2) вести разумную отладку; 3) узнайте о подводных камнях со смешением определенных флагов. Все это рассмотрено в моем ответе. –

+0

Хорошо, О. П. принял его, поэтому, я думаю, я ошибаюсь, что это не полезно для ОП. Однако ничего в этом вопросе не было о вариантах отладки; OP просто хотел вернуться, и, конечно, нет причин пожертвовать «-O3» для этого. Лично я почти никогда не выключаю оптимизацию для целей отладки, но полезно ли это сделать, зависит от типа используемых инструментов отладки и типов ошибок, с которыми вы сталкиваетесь. –

1

-g не имеет никакого влияния на производительность.-rdynamic увеличит размер таблицы динамических символов в главном исполняемом файле, который может замедлить динамическое связывание. Лучше всего предположить, что замедление будет очень маленьким, но возможно измеримым (отличным от нуля) с точными инструментами измерения/профилирования.

Смежные вопросы