Я создаю много автоматически сгенерированного кода, включая один особенно большой файл (~ 15K строк), используя кросс-компилятор mingw32 на linux. Большинство файлов очень быстрые, но для этого большого файла требуется неожиданно большое время (~ 15 минут) для компиляции.
Я попытался манипулировать различными флагами оптимизации, чтобы убедиться, что они имеют какой-либо эффект, без везения. Мне действительно нужен какой-то способ определить, что делает g++, что занимает так много времени. Есть ли (относительно простые) способы, чтобы g++ генерировал вывод о разных этапах компиляции, чтобы помочь мне сузить, что такое зависание?
К сожалению, у меня нет возможности перестроить этот кросс-компилятор, поэтому добавление отладочной информации в компилятор и переход через него не представляется возможным.
Что в файле:
- куча включает
- набор строк сравнения
- куча проверок if-then и вызовов конструктора
Файл представляет собой factory для создания тонны различных определенных подклассов определенного родительского класса. Большинство из них, однако, ничего страшного не представляют.
Результаты -ft-report, как предложил Нил Баттерворт, показывают, что фаза "жизненного анализа" занимает 921 секунду, что занимает большую часть 15 минут.
Похоже, что это происходит во время анализа потока данных. Сам файл представляет собой набор условных сопоставлений строк, создавая объект по имени класса, представленному в виде строки.
Мы думаем, что изменение этой точки на карту имен указателей на функции может немного улучшить ситуацию, поэтому мы попытаемся это сделать.
Действительно, создавая связку функций factory (для каждого объекта) и создавая карту из имени строки объекта указателю на ее функцию factory, сокращенное время компиляции от первоначальных 15 минут до примерно 25 секунд, который сэкономит все тонны времени на своих сборках.
Еще раз спасибо Нилу Баттерворту за отзыв о -ft-report.