Как я узнаю, почему g ++ занимает очень долгое время на конкретном файле?

Я создаю много автоматически сгенерированного кода, включая один особенно большой файл (~15K строки), с помощью mingw32 кросс-компилятора на Linux. Большинство файлов чрезвычайно быстро, но этот большой файл неожиданно занимает много времени (~15 минут) для компиляции.

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

К сожалению, у меня нет способности восстановить этот кросс-компилятор, таким образом добавляя, что отладочной информацией к компилятору и продвижением через нее не является возможность.

Что находится в файле:

  • набор включает
  • набор сравнений строк
  • набор если затем проверки и вызовы конструктора

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


Результаты - ftime-отчет, как предложил Neil Butterworth, указывает, что "жизненная аналитическая фаза " занимает 921 секунду, который поднимает большинство этих 15 минут.

Кажется, что это происходит во время анализа потока данных. Сам файл является набором условных сравнений строк, создавая объект именем класса, обеспеченным как строка.

Мы думаем, изменяя это для указания в карту имен к указателям функции, мог бы улучшить вещи немного, таким образом, мы собираемся попробовать это.


Действительно, генерация набора функций фабрики (на объект) и создание карты с имени строки объекта к указателю на его фабрику функционируют уменьшенное время компиляции от исходных 15 минут приблизительно до 25 секунд, которые сэкономят всем массу времени на их сборках.

Еще раз спасибо Neil Butterworth для подсказки о - ftime-отчет.

17
задан Schamp 20 January 2010 в 14:09
поделиться

8 ответов

Считайте Interlocked.compareexchange .

-121--4605462- [11190462-

не даст всем деталям, которые вы хотите, но попробуйте работать с -V (Verbose) и -FTIME-отчет Флаги. Последнее производит краткое изложение того, к чему было компилятор.

25
ответ дан 30 November 2019 в 12:13
поделиться

Другим процессом для попытки добавить «маркер прогресса» Pragma к вашему коду для ловушки части кода, который занимает много времени. Компилятор Visual Studio предоставляет #Pragma Message () , хотя для этого нет стандартной праграммы.

Положите один маркер в начале кода и маркера в конце кода. Конечный маркер может быть #Error , поскольку вас не заботится о оставшейся части исходного файла. Переместите маркеры соответствующим образом, чтобы поймать раздел кода, занимая самое длинное время.

Просто мысль ...

1
ответ дан 30 November 2019 в 12:13
поделиться

Это, скорее всего, включает в себя тонны включения. Я полагаю, что -md перейдет все включенные файлы в данном файле CPP (который включает в себя включенные включения и т. Д.).

3
ответ дан 30 November 2019 в 12:13
поделиться

У меня были такие проблемы, используя wget это было быстро (макс. 1 секунда), использование ЗАВИТОК заняло около 5 секунд, чтобы получить страницу, когда tcpdump-ing я обнаружил, что ЗАВИТОК пытается выполнить обратный поиск DNS, и если сервер не имеет зарегистрированного DNS-сервера revers, это замедлит работу, Я настроил обратный DNS на своем локальном DNS сервере, так что каждый запрос на этот сайт с использованием ЗАВИТОК теперь идет очень быстро. Я не нашел способ отключить DNS-поиск Revers из параметров настройки cURL.

Мое предположение состоит в том, чтобы отсканировать ваш трафик, чтобы увидеть, где он так долго ждет.

-121--3357877-

Для локализации не используйте жесткий код последовательностей пользовательского интерфейса. Используйте что-то вроде gettext.

-121--2938670-

Что замедляет g++ вниз в целом являются шаблонами. Например, Boost любит их использовать. Это означает хороший код, отличные показатели, но плохая скорость компиляции.

С другой стороны, 15 мин кажется чрезвычайно длинным. После быстрого гугления кажется, что это распространенная проблема с mingw

2
ответ дан 30 November 2019 в 12:13
поделиться

Я бы использовал #if 0 / #endif для устранения больших порций исходного файла из компиляции. Повторите с разными блоками кода до тех пор, пока вы не точно не указате, какие блоки (ы) не имеют медленного. Для начала вы можете увидеть, если ваш #include проблема с использованием #if 0 / #endif , чтобы исключить все, кроме как # # включают .

2
ответ дан 30 November 2019 в 12:13
поделиться

, связанные с @goz и @josh_kelley, вы можете получить GCC / G ++, чтобы выплавить предварительно обработанный источник (с помощью #InCludes Inline), используя -e. Это один из способов определить, насколько велик ваш источник.

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

0
ответ дан 30 November 2019 в 12:13
поделиться

Какой компилятор Видит вывод предварительного процессора, поэтому размер отдельного источника не является хорошей мерой, вы должны учитывать источник и все файлы, которые он включает, и файлы, которые они включают и т. Д. Приведены к созданию шаблонов для нескольких типов. код для каждого отдельного типа используется, так что может в конечном итоге быть большим количеством кода. Если вы сделали обширные использованные для различных контейнеров STL для многих классов.

15K строки в одном источнике довольно много, но даже если они разделены, все этот код все еще должен быть скомпилирован; Однако использование инкрементной сборки может означать, что он не все нуждается в компиляции все время. Там действительно нет необходимости в файле, который большой; его просто плохая практика / дизайн. Я начинаю думать о лучшей модуляции, когда файл добирается до 500 строк (хотя я не догматичен об этом)

0
ответ дан 30 November 2019 в 12:13
поделиться

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

Если вы видите, что произойдет, легко установить больше RAM ... или просто разделите файл на несколько частей, которые могут быть скомпилированы отдельно.

0
ответ дан 30 November 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: