Как ускорить время связывания С++

Есть ли способ оптимизировать время связывания в MS Visual studio С++ (2005)? Мы используем Xoreax Incredibuild для ускорения компиляции, но ничего для ссылки.

В настоящее время каждое соединение занимает около 30 секунд. Когда я включаю инкрементную привязку, она занимает 35-40 секунд. (Независимо от того, компилирую ли я проект с помощью или без него)

Есть ли какой-либо способ, как профилировать компоновщик и смотреть, сколько времени требуется? Или любой инструмент для параллельного соединения? Или любые советы по оптимизации кода для ускорения компоновщика?

Спасибо за ответ Людек Водичка


Edit:

Спасибо за первые ответы и дополнительную информацию:

  • Целая оптимизация программы и генерация кода времени соединения уже отключены.
  • Идиома PIMPL уже используется, когда это возможно
  • другие статические библиотеки уже включены через #pragma comment (lib, "pathToLib" ). (также из-за упрощения обслуживания)
  • HW: четырехъядерный процессор q6600, 8 ГБ, 3-кратный рейд-рейд WD 0. Windows Vista 64bit

Ответ 1

Я не знаю никаких инструментов параллельной компоновки; Я знаю, что Incredibuild не позволяет этого.

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

Накладные расходы для связывания проектов через Зависимости проектов также довольно высоки. Если ваша целевая платформа - только Win32 или, в первую очередь, вы можете использовать заголовок для связывания зависимых библиотек с помощью #pragma comment (lib, "pathToLib" ).

Ответ 2

Если вы можете жить без оптимизации, отключите генерацию кода времени (удалите/GL-переключатель или в свойствах c/С++ → Оптимизация → Оптимизация всей программы. Для компоновщика remove/ltcg или используйте время ссылки Настройка генерации кода). Это заставит компилятор работать медленнее, поскольку генерация кода теперь происходит во время компиляции.

Я видел проекты, которые занимают часы, чтобы строить с помощью /GL +/LTCG, всего лишь секунд без (это, например: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/750ed2b0-0d51-48a3-bd9a-e8f4b544ded8)

Ответ 3

Рассматривали ли вы улучшение аппаратного обеспечения?
Вы используете отдельный жесткий диск для сборки? Какие диски вы используете?

Как общее предложение: бросьте в какую-то память, получите Velociraptor, поместите только источники и создайте каталог там, снова измерьте. Если это помогает, рассмотрите RAID 0.

Я слышал сообщения о том, что обновление с ядра ядра до ядра W2K3 улучшило время сборки, вероятно, из-за улучшения управления памятью и кэширования.

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

Ответ 4

Есть несколько общих предложений по настройке Улучшение времени соединения с IncrediBuild

Вы также можете пропустить ссылку на статические библиотеки, в которых вы не будете распространять их, используя IncrediLink

Мы обнаружили, что добавление этапа сборки подписи может остановить IncrediBuild от работы над следующими проектами, добавив, что комментарий к пост-сборке должен был помочь

rem IncrediBuild_AllowOverlap

См. IncrediBuild_AllowOverlap doc