Каковы плюсы + минусы генерации кода Link-Time? (VS 2005)

Я слышал, что включение Generate Code Generation (переключатель/LTCG) может стать основной оптимизацией для крупных проектов с большим количеством библиотек для связи. Моя команда использует его в конфигурации Release нашего решения, но длительное время компиляции - реальное перетаскивание. Одно изменение в один файл, что никакой другой файл не зависит от триггеров еще на 45 секунд "Генерация кода...". Выпуск, конечно, намного быстрее, чем Debug, но мы могли бы добиться такого же ускорения, отключив LTCG и просто уехав /O 2.

Стоит ли его оставить /LTCG включен?

Ответ 1

Трудно сказать, потому что это зависит в основном от вашего проекта - и, конечно же, от качества LTCG, предоставленного VS2005 (которого у меня недостаточно, чтобы судить). В конце вы должны будете измерить.

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

Рекомендуемая настройка для команды: Разработчики обычно создают только инкрементные отладочные сборки на своих машинах. Создание релиза должно быть полной сборкой из исходного элемента управления до распространяемого (двоичные файлы или даже установки), с новым номером версии и маркировкой/архивированием источников. Только они должны быть предоставлены внутренним тестировщикам/клиентам.

В идеале вы должны переместить полную сборку на отдельную машину или, возможно, на виртуальную машину на хорошем ПК. Это дает вам стабильную среду для ваших сборок (включая, сторонние библиотеки, переменные среды и т.д.).

В идеале эти сборки должны быть автоматизированы ( "один клик от источника управления до установки" ) и должны выполняться ежедневно.

Ответ 2

Он позволяет компоновщику выполнять фактическую компиляцию кода, и поэтому он может сделать большую оптимизацию, такую ​​как inlining.

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

Поэтому он может делать это только с функциями, которые имеют тело. Это означает, что если функция в файле cpp вызывает другую функцию, которая не реализована в том же файле cpp (или в заголовочном файле, который включен), то он не имеет фактического тела функции и поэтому не может вставлять его.

Но если вы используете LTCG, это компоновщик, который выполняет inlining, и он имеет все функции во всех файлах cpp всего проекта, минус ссылки на файлы lib, которые не были созданы с помощью LTCG. Это дает компоновщику (который становится компилятором) гораздо больше для работы.

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

Обратите внимание, что LTCG не совпадает с оптимизацией на основе профиля.

Ответ 3

Я знаю, что ребята из Bungie использовали его для Halo3, единственное, о чем они говорили, это то, что он иногда испортил свои детерминированные данные воспроизведения.

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

Не знаете, какое приложение вы создаете, но разбивать структуры данных, чтобы они соответствовали тому, как они обрабатывались в коде (для лучшей когерентности кеша). Это было гораздо более выгодным для нас.

Ответ 4

Я обнаружил, что нижние части больше времени компиляции и что файлы .obj, созданные в этом режиме (LTCG включен), могут быть очень массивными. Например, файлы .obj, которые могут быть 200-500k, составляют около 2-3 МБ. Мне просто случилось, что сборка проектов в моей цепочке привела к созданию папки размером 2 ГБ, основная часть которой была .obj файлами.

Ответ 5

Я также не вижу проблем с дополнительным временем компиляции с использованием генерации кода link-time с сборкой релиза. Я только создаю свою версию выпуска один раз в день (за одну ночь) и использую модульные тесты и отладочные сборки в течение дня.