У меня есть проект C++ прежней версии, который раздражающе занимает много времени для создания (несколько минут, даже для небольших возрастающих изменений), и я нашел, большую часть времени был потрачен, связавшись.
Проект уже использует предварительно скомпилированные заголовки и инкрементную компиляцию. Я включил "/время" параметр командной строки в надежде, я получил бы больше деталей о том, что замедляет компоновщика и получило следующий вывод:
1>Linking...
1> MD Merge: Total time = 59.938s
1> Generate Transitions: Total time = 0.500s
1> MD Finalize: Total time = 7.328s
1>Pass 1: Interval #1, time = 71.718s
1>Pass 2: Interval #2, time = 8.969s
1>Final: Total time = 80.687s
1>Final: Total time = 80.953s
Существует ли способ получить больше деталей о каждом из этих шагов? Например, я хотел бы найти, проводят ли они большую часть времени, связываясь с определенным .lib или .obj файлом.
Кроме того, есть ли какая-либо документация, которая объясняет, что каждый из этих шагов делают?
На этапе «MD Merge» выполняется поиск и объединение повторяющихся строковых литералов и других дублированных данных. Обратите внимание, что время, необходимое для этого, составляет O (n ^ 2) по сравнению с количеством строковых литералов, которые у вас есть, поэтому у меня когда-то была аналогичная проблема, когда файл заголовка со строковыми литералами ~ 10K потребовал бы 5 минут для связывания.
Может помочь добавление флага компоновщика / OPT: NOICF
. В качестве альтернативы, исследуйте, почему вам нужно сворачивать так много литералов.
Надеюсь, кто-то из команды разработчиков vs увидит это и сможет прокомментировать, может быть, разместить ссылку на их форум/блог и надеяться на лучшее?
Первая случайная теория, которая приходит мне в голову, - это исследовать, как много кода в заголовке генерируется, чтобы на "фазе 1" было так много работы по устранению дубликатов. Я имею в виду шаблоны, макросы или объявления констант старого образца. Они также могут быть усугублены включением в общий предварительно скомпилированный заголовок, как я часто видел в наивных настройках для проектов, использующих windows/mfc/STL.
Удачи, было бы здорово услышать, если бы вы нашли что-то конкретное, что было плохо.