Компиляция трассировки gcc и какой код замедляет ее

17

Я хочу узнать, какой код вызывает медленное время компиляции в gcc. Раньше у меня был скомпилированный код, и кто-то сказал мне, что переключатель командной строки делает gcc печатать каждый шаг, который он компилирует, включая каждую функцию / переменную / символ и т. Д. Это очень помогло (я мог буквально видеть в консоли, где gcc дросселирует), но я забыл, что такое переключатель.

    
задан queen3 14.12.2012 в 14:07
источник
  • Примечание: для общей медлительности также может быть полезно использовать вызов (например, длинный список -I-директив может привести к чрезмерно длинному просмотру файлов заголовков). –  Matthieu M. 14.12.2012 в 14:21
  • Да, спасибо. Но для этого случая мне нужно измерить только предварительно обработанную компиляцию (поскольку distcc используется вместе с предварительно скомпилированными заголовками). –  queen3 14.12.2012 в 14:23

3 ответа

22

Я нашел его (на странице gcc man ):

  

-Q      

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

    
ответ дан queen3 14.12.2012 в 14:18
  • Хорошо знать, спасибо за обмен. Я не знал об этом переключателе. –  user1284631 14.12.2012 в 14:20
4

См. также этот ответ на довольно похожий вопрос.

Вы, вероятно, захотите вызвать GCC с -time или, более вероятно, -ftime-report который дает вам время, затраченное на cc1 или cc1plus ... (собственно компилятор запускается командой gcc или g++ ), которая показывает время, затраченное на каждую внутреннюю фазу или проходы компилятора GCC.

Вы узнаете, что для программ на C разбор - это небольшая часть времени компиляции, как только вы запрашиваете некоторую оптимизацию, например. -O1 или -O2 . (Это менее справедливо для C ++, когда разбор может занимать половину времени, особенно, поскольку расширение шаблона рассматривается как синтаксический анализ).

Эмпирически, что замедляет GCC, очень длинные функциональные тела. Лучше иметь 50 функций по 1000 строк каждая, чем одна функция из 50000 строк.

    
ответ дан Basile Starynkevitch 14.12.2012 в 14:35
  • В нашем коде на C ++ синтаксический анализ составляет 50-60% времени (как сообщалось по -time-report). –  queen3 14.12.2012 в 14:59
  • Следовательно, мой комментарий «менее прав для C ++» –  Basile Starynkevitch 14.12.2012 в 15:06
0

Попробуйте выполнить компиляцию -v (verbose).

Смотрите эту ссылку:

Ссылка

изменить:

Я понимаю. Возможно, это поможет:

gcc -fdump-tree-all -fdump-rtl-all

и т.п. (-fdump-pass). См. Здесь: Ссылка

    
ответ дан user1284631 14.12.2012 в 14:10
  • Нет, он печатает только каждую запрограммированную программу, а не каждый символ, который он анализирует. –  queen3 14.12.2012 в 14:12